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

102 lines
No EOL
3.3 KiB
C#

using System;
using System.Threading.Tasks;
using PhoenixLib.Events;
using WingsEmu.Core.Extensions;
using WingsEmu.Game._i18n;
using WingsEmu.Game.Battle;
using WingsEmu.Game.Extensions;
using WingsEmu.Game.Extensions.Mates;
using WingsEmu.Game.Managers;
using WingsEmu.Game.Mates;
using WingsEmu.Game.Mates.Events;
using WingsEmu.Game.Networking;
using WingsEmu.Game.Networking.Broadcasting;
using WingsEmu.Packets.ClientPackets;
using WingsEmu.Packets.Enums;
using WingsEmu.Packets.Enums.Chat;
namespace WingsEmu.Plugins.PacketHandling.Game.Mate;
public class PslPacketHandler : GenericGamePacketHandlerBase<PslPacket>
{
private readonly IDelayManager _delayManager;
private readonly IAsyncEventPipeline _eventPipeline;
private readonly IGameLanguageService _gameLanguage;
public PslPacketHandler(IAsyncEventPipeline eventPipeline, IDelayManager delayManager, IGameLanguageService languageService)
{
_eventPipeline = eventPipeline;
_delayManager = delayManager;
_gameLanguage = languageService;
}
protected override async Task HandlePacketAsync(IClientSession session, PslPacket packet)
{
if (session.PlayerEntity.IsOnVehicle)
{
return;
}
IMateEntity mateEntity = session.PlayerEntity.MateComponent.GetMate(x => x.IsTeamMember && x.MateType == MateType.Partner);
if (mateEntity == null)
{
return;
}
if (mateEntity.Specialist == null)
{
session.SendMsg(_gameLanguage.GetLanguage(GameDialogKey.PARTNER_MESSAGE_NO_SP_EQUIPPED, session.UserLanguage), MsgMessageType.Middle);
return;
}
if (!mateEntity.IsAlive())
{
return;
}
if (!mateEntity.IsSpCooldownElapsed())
{
session.SendMsg(_gameLanguage.GetLanguageFormat(GameDialogKey.PARTNER_SHOUTMESSAGE_SP_IN_COOLDOWN, session.UserLanguage, mateEntity.GetSpCooldown()), MsgMessageType.Middle);
return;
}
if (mateEntity.IsSitting)
{
await mateEntity.Owner.Session.EmitEventAsync(new MateRestEvent
{
MateEntity = mateEntity,
Force = true
});
}
if (packet.Type == 0)
{
if (!mateEntity.IsUsingSp)
{
DateTime time = await _delayManager.RegisterAction(mateEntity, DelayedActionType.PartnerWearSp);
session.SendMateDelay(mateEntity, time.GetTotalMillisecondUntilNow(), GuriType.Transforming, "#psl^1");
session.Broadcast(mateEntity.GenerateMateDance(), new RangeBroadcast(mateEntity.PositionX, mateEntity.PositionY));
return;
}
await session.EmitEventAsync(new MateSpUntransformEvent
{
MateEntity = mateEntity
});
return;
}
bool canPerformAction = await _delayManager.CanPerformAction(mateEntity, DelayedActionType.PartnerWearSp);
if (!canPerformAction)
{
return;
}
await _delayManager.CompleteAction(session.PlayerEntity, DelayedActionType.PartnerWearSp);
await session.EmitEventAsync(new MateSpTransformEvent
{
MateEntity = mateEntity
});
}
}