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

138 lines
No EOL
4.2 KiB
C#

using System;
using System.Threading;
using System.Threading.Tasks;
using PhoenixLib.Events;
using WingsAPI.Scripting.Object.Timespace;
using WingsEmu.Game._i18n;
using WingsEmu.Game.Extensions;
using WingsEmu.Game.Maps;
using WingsEmu.Game.Maps.Event;
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 TimeSpaceJoinMapEndEventHandler : IAsyncEventProcessor<JoinMapEndEvent>
{
private readonly ITimeSpaceManager _timeSpaceManager;
public TimeSpaceJoinMapEndEventHandler(ITimeSpaceManager timeSpaceManager) => _timeSpaceManager = timeSpaceManager;
public async Task HandleAsync(JoinMapEndEvent e, CancellationToken cancellation)
{
IClientSession session = e.Sender;
if (e.JoinedMapInstance.MapInstanceType != MapInstanceType.TimeSpaceInstance)
{
return;
}
if (!session.PlayerEntity.TimeSpaceComponent.IsInTimeSpaceParty)
{
return;
}
TimeSpaceParty timeSpace = session.PlayerEntity.TimeSpaceComponent.TimeSpace;
if (timeSpace?.Instance == null)
{
return;
}
if (timeSpace.Instance.StartTimeFreeze.HasValue)
{
await session.EmitEventAsync(new TimeSpaceAddTimeToTimerEvent
{
Time = DateTime.UtcNow - timeSpace.Instance.StartTimeFreeze.Value
});
timeSpace.Instance.StartTimeFreeze = null;
}
session.RefreshTimespaceScoreUi();
if (!timeSpace.Instance.VisitedRooms.Contains(e.JoinedMapInstance.Id) && timeSpace.Instance.SpawnInstance.MapInstance.Id != e.JoinedMapInstance.Id)
{
timeSpace.Instance.IncreaseEnteredRooms();
timeSpace.Instance.VisitedRooms.Add(e.JoinedMapInstance.Id);
}
if (!timeSpace.Instance.TimeSpaceSubInstances.TryGetValue(e.JoinedMapInstance.Id, out TimeSpaceSubInstance room))
{
return;
}
if (room.SendPortalOpenMessage)
{
room.SendPortalOpenMessage = false;
session.SendMsg(session.GetLanguage(GameDialogKey.TIMESPACE_SHOUTMESSAGE_DOOR_OPENED), MsgMessageType.Middle);
}
if (!string.IsNullOrEmpty(room.Task.StartDialogShout))
{
session.SendMsg(session.GetLanguage(room.Task.StartDialogShout), MsgMessageType.Middle);
}
if (room.Task?.StartDialog != null)
{
session.SendNpcReqPacket(room.Task.StartDialog.Value);
if (timeSpace.Instance.StartTimeFreeze.HasValue)
{
return;
}
if (!timeSpace.Started || timeSpace.Finished)
{
return;
}
timeSpace.Instance.StartTimeFreeze = DateTime.UtcNow;
foreach (IClientSession member in timeSpace.Members)
{
member.SendTimerFreeze();
}
}
SendWarnings(session, room);
await room.TriggerEvents(TimespaceConstEventKeys.OnMapJoin);
}
private void SendWarnings(IClientSession session, TimeSpaceSubInstance timeSpaceSubInstance)
{
TimeSpaceTask task = timeSpaceSubInstance.Task;
if (task == null)
{
return;
}
if (task.IsFinished || !task.IsActivated)
{
return;
}
if (task.TimeLeft.HasValue && task.Time.HasValue)
{
TimeSpan timeLeft = task.TimeLeft.Value - DateTime.UtcNow;
if (timeLeft.TotalMilliseconds > 0)
{
session.SendClockPacket(ClockType.RedMiddle, 0, timeLeft, task.Time.Value);
}
}
if (timeSpaceSubInstance.Task.TaskType != TimeSpaceTaskType.None)
{
session.SendRsfmPacket(!timeSpaceSubInstance.Task.IsActivated ? TimeSpaceAction.WARNING_WITH_SOUND : TimeSpaceAction.WARNING_WITHOUT_SOUND);
}
if (string.IsNullOrEmpty(task.GameDialogKey))
{
return;
}
string message = session.GetLanguage(task.GameDialogKey);
session.SendMissionTargetMessage(message);
}
}