server-master/srcs/_plugins/WingsEmu.Plugins.PacketHandling/Game/Basic/ArenaPacketHandler.cs
2026-02-10 18:21:30 +01:00

81 lines
No EOL
2.5 KiB
C#

using System;
using System.Threading.Tasks;
using WingsEmu.DTOs.Maps;
using WingsEmu.Game._i18n;
using WingsEmu.Game.Arena;
using WingsEmu.Game.Battle;
using WingsEmu.Game.Extensions;
using WingsEmu.Game.Maps;
using WingsEmu.Game.Networking;
using WingsEmu.Packets.ClientPackets;
using WingsEmu.Packets.Enums.Chat;
namespace WingsEmu.Plugins.PacketHandling.Game.Basic;
public class ArenaPacketHandler : GenericGamePacketHandlerBase<ArenaPacket>
{
private readonly IArenaManager _arenaManager;
private readonly IGameLanguageService _gameLanguage;
private readonly IMapManager _mapManager;
public ArenaPacketHandler(IGameLanguageService gameLanguage, IMapManager mapManager, IArenaManager arenaManager)
{
_gameLanguage = gameLanguage;
_mapManager = mapManager;
_arenaManager = arenaManager;
}
protected override async Task HandlePacketAsync(IClientSession session, ArenaPacket packet)
{
byte arenaType = packet.ArenaType;
if (arenaType > 1)
{
return;
}
double timeSpanSinceLastPortal = (DateTime.UtcNow - session.PlayerEntity.LastPortal).TotalSeconds;
if (timeSpanSinceLastPortal < 4 || !session.HasCurrentMapInstance)
{
session.SendChatMessage(_gameLanguage.GetLanguage(GameDialogKey.PORTAL_CHATMESSAGE_TOO_EARLY, session.UserLanguage), ChatMessageColorType.Yellow);
return;
}
if (session.CantPerformActionOnAct4())
{
return;
}
if (!session.CurrentMapInstance.HasMapFlag(MapFlags.IS_BASE_MAP))
{
return;
}
if (session.PlayerEntity.IsInRaidParty)
{
return;
}
if (session.PlayerEntity.TimeSpaceComponent.IsInTimeSpaceParty)
{
return;
}
if (!session.PlayerEntity.IsAlive())
{
return;
}
if (session.PlayerEntity.Gold < 500 * (1 + arenaType))
{
session.SendChatMessage(_gameLanguage.GetLanguage(GameDialogKey.INTERACTION_MESSAGE_NOT_ENOUGH_GOLD, session.UserLanguage), ChatMessageColorType.Yellow);
return;
}
session.PlayerEntity.LastPortal = DateTime.UtcNow;
session.PlayerEntity.Gold -= 500 * (1 + arenaType);
session.RefreshGold();
await _mapManager.TeleportOnRandomPlaceInMapAsync(session, arenaType == 0 ? _arenaManager.ArenaInstance : _arenaManager.FamilyArenaInstance);
}
}