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

64 lines
No EOL
2.1 KiB
C#

using System;
using System.Linq;
using System.Threading.Tasks;
using PhoenixLib.Logging;
using WingsAPI.Communication.ServerApi.Protocol;
using WingsEmu.Game;
using WingsEmu.Game._i18n;
using WingsEmu.Game.Battle;
using WingsEmu.Game.Extensions;
using WingsEmu.Game.Maps.Event;
using WingsEmu.Game.Networking;
using WingsEmu.Packets.ClientPackets;
namespace WingsEmu.Plugins.PacketHandling.Game.Basic;
public class PreqPacketHandler : GenericGamePacketHandlerBase<PreqPacket>
{
private readonly IGameLanguageService _languageService;
private readonly SerializableGameServer _serializableGameServer;
public PreqPacketHandler(IGameLanguageService languageService, SerializableGameServer serializableGameServer)
{
_languageService = languageService;
_serializableGameServer = serializableGameServer;
}
protected override async Task HandlePacketAsync(IClientSession session, PreqPacket packet)
{
bool isAct4 = _serializableGameServer.ChannelType == GameChannelType.ACT_4;
if (session.PlayerEntity.LastMapChange + TimeSpan.FromSeconds(isAct4 ? 5 : 2) > DateTime.UtcNow)
{
session.SendInformationChatMessage(_languageService.GetLanguage(GameDialogKey.PORTAL_CHATMESSAGE_TOO_EARLY, session.UserLanguage));
return;
}
if (session.PlayerEntity.IsSeal)
{
return;
}
if (!session.PlayerEntity.IsAlive())
{
return;
}
IPortalEntity portal = session.CurrentMapInstance.Portals.Concat(session.PlayerEntity.GetExtraPortal()).FirstOrDefault(s =>
session.PlayerEntity.PositionY >= s.PositionY - 1 &&
session.PlayerEntity.PositionY <= s.PositionY + 1 &&
session.PlayerEntity.PositionX >= s.PositionX - 1 &&
session.PlayerEntity.PositionX <= s.PositionX + 1);
if (portal == null)
{
Log.Debug("Portal not found");
return;
}
await session.EmitEventAsync(new PortalTriggerEvent
{
Portal = portal,
Confirmed = packet.Confirmed
});
}
}