server-master/srcs/_plugins/Plugin.TimeSpaces/Handlers/TimeSpaceCheckObjectivesEventHandler.cs
2026-02-10 18:21:30 +01:00

101 lines
No EOL
3.2 KiB
C#

using System;
using System.Threading;
using System.Threading.Tasks;
using PhoenixLib.Events;
using WingsEmu.Game._i18n;
using WingsEmu.Game.Extensions;
using WingsEmu.Game.Networking;
using WingsEmu.Game.TimeSpaces;
using WingsEmu.Game.TimeSpaces.Enums;
using WingsEmu.Game.TimeSpaces.Events;
using WingsEmu.Packets.Enums;
using WingsEmu.Packets.Enums.Chat;
namespace Plugin.TimeSpaces.Handlers;
public class TimeSpaceCheckObjectivesEventHandler : IAsyncEventProcessor<TimeSpaceCheckObjectivesEvent>
{
private readonly IAsyncEventPipeline _asyncEventPipeline;
public TimeSpaceCheckObjectivesEventHandler(IAsyncEventPipeline asyncEventPipeline) => _asyncEventPipeline = asyncEventPipeline;
public async Task HandleAsync(TimeSpaceCheckObjectivesEvent e, CancellationToken cancellation)
{
IClientSession session = e.Sender;
TimeSpaceParty timeSpace = e.TimeSpaceParty;
TimeSpaceObjective objectives = timeSpace.Instance.TimeSpaceObjective;
bool playerEnteredToEndPortal = e.PlayerEnteredToEndPortal;
if (timeSpace.Finished)
{
return;
}
bool finishTimeSpace = true;
if (objectives.KillAllMonsters)
{
foreach (TimeSpaceSubInstance map in timeSpace.Instance.TimeSpaceSubInstances.Values)
{
if (map.MapInstance.GetAliveMonsters(m => m.SummonerType is not VisualType.Player).Count == 0)
{
if (map.SpawnAfterMobsKilled.Count == 0 && map.Task?.MonstersAfterTaskStart.Count == 0)
{
continue;
}
}
finishTimeSpace = false;
break;
}
}
if (objectives.KillMonsterAmount.HasValue)
{
finishTimeSpace = objectives.KillMonsterAmount.Value == objectives.KilledMonsterAmount;
}
if (objectives.CollectItemAmount.HasValue)
{
finishTimeSpace = objectives.CollectItemAmount.Value == objectives.CollectedItemAmount;
}
if (objectives.Conversation.HasValue)
{
finishTimeSpace = objectives.Conversation.Value == objectives.ConversationsHad;
}
if (objectives.InteractObjectsAmount.HasValue)
{
finishTimeSpace = objectives.InteractObjectsAmount.Value == objectives.InteractedObjectsAmount;
}
if (!finishTimeSpace)
{
if (e.SendMessageWithNotFinishedObjects && session != null)
{
session.SendChatMessage(session.GetLanguage(GameDialogKey.TIMESPACE_CHATMESSAGE_NOT_FINISHED_TASKS), ChatMessageColorType.PlayerSay);
}
return;
}
if (objectives.GoToExit && !playerEnteredToEndPortal)
{
return;
}
if (timeSpace.Instance.PreFinishDialog.HasValue)
{
if (timeSpace.Instance.PreFinishDialogTime.HasValue)
{
return;
}
timeSpace.Instance.PreFinishDialogTime = DateTime.UtcNow;
return;
}
await _asyncEventPipeline.ProcessEventAsync(new TimeSpaceInstanceFinishEvent(timeSpace, TimeSpaceFinishType.SUCCESS));
}
}