server-master/srcs/_plugins/Plugin.Act4/Event/Act4JoinMapEndEventHandler.cs
2026-02-10 18:21:30 +01:00

75 lines
No EOL
2.6 KiB
C#

using System;
using System.Threading;
using System.Threading.Tasks;
using PhoenixLib.Events;
using WingsEmu.Game.Act4;
using WingsEmu.Game.Extensions;
using WingsEmu.Game.Managers;
using WingsEmu.Game.Maps;
using WingsEmu.Game.Maps.Event;
using WingsEmu.Game.Networking;
namespace Plugin.Act4.Event;
public class Act4JoinMapEndEventHandler : IAsyncEventProcessor<JoinMapEndEvent>
{
private readonly IAct4DungeonManager _act4DungeonManager;
private readonly IAct4Manager _act4Manager;
public Act4JoinMapEndEventHandler(IAct4Manager act4Manager, IAct4DungeonManager act4DungeonManager)
{
_act4Manager = act4Manager;
_act4DungeonManager = act4DungeonManager;
}
public async Task HandleAsync(JoinMapEndEvent e, CancellationToken cancellation)
{
e.Sender.SendFcPacket(_act4Manager.GetStatus());
e.Sender.SendGuriFactionOverridePacket();
if (e.JoinedMapInstance.MapInstanceType != MapInstanceType.Act4Dungeon || e.Sender.PlayerEntity.Family == null)
{
return;
}
DungeonInstance dungeon = _act4DungeonManager.GetDungeon(e.Sender.PlayerEntity.Family.Id);
if (dungeon == null || !dungeon.DungeonSubInstances.TryGetValue(e.JoinedMapInstance.Id, out DungeonSubInstance dungeonSubInstance))
{
return;
}
bool firstPlayerToJoinInBoss = (dungeonSubInstance.LastDungeonWaveLoop == null || dungeonSubInstance.LastDungeonWaveLinear == null || dungeonSubInstance.LastPortalGeneration == null) &&
dungeonSubInstance.Bosses.Count > 0;
DateTime currentTime = DateTime.UtcNow;
e.Sender.SendDungeonPacket(dungeon, dungeonSubInstance, _act4DungeonManager, currentTime);
dungeonSubInstance.LastDungeonWaveLoop ??= currentTime;
dungeonSubInstance.LastDungeonWaveLinear ??= currentTime;
dungeonSubInstance.LastPortalGeneration ??= currentTime;
if (!firstPlayerToJoinInBoss)
{
return;
}
dungeon.StartInBoosRoom = currentTime;
foreach (DungeonSubInstance subInstance in dungeon.DungeonSubInstances.Values)
{
foreach (DungeonLoopWave wave in subInstance.LoopWaves)
{
wave.FirstSpawnWave = currentTime + wave.Delay;
}
if (subInstance == dungeonSubInstance)
{
continue;
}
foreach (IClientSession session in subInstance.MapInstance.Sessions)
{
session.ChangeMap(dungeonSubInstance.MapInstance, e.Sender.PlayerEntity.PositionX, e.Sender.PlayerEntity.PositionY);
}
}
}
}