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

50 lines
No EOL
1.7 KiB
C#

using System;
using System.Threading.Tasks;
using WingsAPI.Communication;
using WingsAPI.Communication.Sessions;
using WingsAPI.Communication.Sessions.Request;
using WingsAPI.Communication.Sessions.Response;
using WingsEmu.Game.Characters.Events;
using WingsEmu.Game.Extensions;
using WingsEmu.Game.Networking;
using WingsEmu.Packets.ClientPackets;
namespace WingsEmu.Plugins.PacketHandling.Game.Basic;
public class PulsePacketHandler : GenericGamePacketHandlerBase<PulsePacket>
{
private readonly ISessionService _sessionService;
public PulsePacketHandler(ISessionService sessionService) => _sessionService = sessionService;
protected override async Task HandlePacketAsync(IClientSession session, PulsePacket packet)
{
// if player used Speed Hack in CE and client sent pulse packet too quickly
double seconds = (DateTime.UtcNow - session.PlayerEntity.LastPulseTick).TotalSeconds;
if (seconds < 50 && !session.IsGameMaster())
{
await session.NotifyStrangeBehavior(StrangeBehaviorSeverity.ABUSING, "Player used Speed Hack in Cheat Engine, because client sent pulse packet too quickly");
session.ForceDisconnect();
return;
}
session.PlayerEntity.LastPulse += 60;
if (packet.Tick != session.PlayerEntity.LastPulse)
{
session.ForceDisconnect();
return;
}
session.PlayerEntity.LastPulseTick = DateTime.UtcNow;
SessionResponse response = await _sessionService.Pulse(new PulseRequest
{
AccountId = session.Account.Id
});
if (response.ResponseType != RpcResponseType.SUCCESS)
{
session.ForceDisconnect();
}
}
}