server-master/srcs/_plugins/WingsEmu.Plugins.BasicImplementation/NpcDialogs/TimeSpace/TimeSpaceDialogHandler.cs
2026-02-10 18:21:30 +01:00

117 lines
No EOL
3.2 KiB
C#

using System;
using System.Threading.Tasks;
using WingsEmu.Game._NpcDialog;
using WingsEmu.Game._NpcDialog.Event;
using WingsEmu.Game.Maps;
using WingsEmu.Game.Networking;
using WingsEmu.Game.TimeSpaces;
using WingsEmu.Game.TimeSpaces.Events;
using WingsEmu.Packets.Enums;
namespace WingsEmu.Plugins.BasicImplementations.NpcDialogs.TimeSpace;
public class TimeSpaceDialogHandler : INpcDialogAsyncHandler
{
public NpcRunType[] NpcRunTypes => new[] { NpcRunType.TIME_SPACE_END_DIALOG };
public async Task Execute(IClientSession session, NpcDialogEvent e)
{
if (!session.HasCurrentMapInstance)
{
return;
}
if (!session.PlayerEntity.TimeSpaceComponent.IsInTimeSpaceParty)
{
return;
}
if (session.CurrentMapInstance.MapInstanceType != MapInstanceType.TimeSpaceInstance)
{
return;
}
TimeSpaceParty timeSpace = session.PlayerEntity.TimeSpaceComponent.TimeSpace;
if (timeSpace?.Instance == null)
{
return;
}
if (!timeSpace.Instance.TimeSpaceSubInstances.TryGetValue(session.CurrentMapInstance.Id, out TimeSpaceSubInstance instance))
{
return;
}
if (instance.Task == null)
{
return;
}
if (instance.Task.StartDialog.HasValue)
{
if (!instance.Task.DialogStartTask)
{
await TryAddFrozenTime(session, timeSpace);
return;
}
instance.Task.StartDialog = null;
await TryAddFrozenTime(session, timeSpace);
if (instance.Task.StartDialogIsObjective)
{
instance.Task.StartDialogIsObjective = false;
timeSpace.Instance.TimeSpaceObjective.ConversationsHad++;
await session.EmitEventAsync(new TimeSpaceRefreshObjectiveProgressEvent());
}
if (instance.Task.IsFinished)
{
return;
}
await session.EmitEventAsync(new TimeSpaceStartTaskEvent
{
TimeSpaceSubInstance = instance
});
return;
}
if (!instance.Task.EndDialog.HasValue)
{
return;
}
instance.Task.EndDialog = null;
await TryAddFrozenTime(session, timeSpace);
if (!instance.Task.EndDialogIsObjective)
{
return;
}
if (instance.Task.IsFinished)
{
return;
}
instance.Task.EndDialogIsObjective = false;
timeSpace.Instance.TimeSpaceObjective.ConversationsHad++;
await session.EmitEventAsync(new TimeSpaceRefreshObjectiveProgressEvent());
}
private async Task TryAddFrozenTime(IClientSession session, TimeSpaceParty timeSpaceParty)
{
if (!timeSpaceParty.Instance.StartTimeFreeze.HasValue)
{
return;
}
await session.EmitEventAsync(new TimeSpaceAddTimeToTimerEvent
{
Time = DateTime.UtcNow - timeSpaceParty.Instance.StartTimeFreeze.Value
});
timeSpaceParty.Instance.StartTimeFreeze = null;
}
}