117 lines
No EOL
3.2 KiB
C#
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;
|
|
}
|
|
} |