// // CondPacketResponder.cs // // Copyright (c) František Boháček. All rights reserved. // Licensed under the MIT license. See LICENSE file in the project root for full license information. using NosSmooth.Core.Packets; using NosSmooth.Game.Data.Entities; using NosSmooth.Game.Events.Core; using NosSmooth.Game.Events.Entities; using NosSmooth.Packets.Server.Entities; using Remora.Results; namespace NosSmooth.Game.PacketHandlers.Entities; /// /// Responder to cond packet. /// public class CondPacketResponder : IPacketResponder { private readonly Game _game; private readonly EventDispatcher _eventDispatcher; /// /// Initializes a new instance of the class. /// /// The game. /// The event dispatcher. public CondPacketResponder(Game game, EventDispatcher eventDispatcher) { _game = game; _eventDispatcher = eventDispatcher; } /// public async Task Respond(PacketEventArgs packetArgs, CancellationToken ct = default) { var map = _game.CurrentMap; if (map is null) { return Result.FromSuccess(); } var packet = packetArgs.Packet; var entity = map.Entities.GetEntity(packet.EntityId); if (entity is null) { return Result.FromSuccess(); } bool cantMove = entity.CantMove; bool cantAttack = entity.CantAttack; entity.Speed = packet.Speed; entity.CantAttack = packet.CantAttack; entity.CantMove = packet.CantMove; if (cantMove != packet.CantMove || cantAttack != packet.CantAttack) { return await _eventDispatcher.DispatchEvent(new EntityStunnedEvent(entity, packet.CantMove, packet.CantAttack), ct); } return Result.FromSuccess(); } }