// // WalkResponder.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.Characters; using NosSmooth.Game.Data.Info; using NosSmooth.Game.Events.Core; using NosSmooth.Game.Events.Entities; using NosSmooth.Packets.Packets.Client.Movement; using Remora.Results; namespace NosSmooth.Game.PacketHandlers.Characters; /// /// Responds to walk packet. /// public class WalkResponder : IPacketResponder { private readonly Game _game; private readonly EventDispatcher _eventDispatcher; /// /// Initializes a new instance of the class. /// /// The nostale game. /// The event dispatcher. public WalkResponder(Game game, EventDispatcher eventDispatcher) { _game = game; _eventDispatcher = eventDispatcher; } /// public async Task Respond(PacketEventArgs packetArgs, CancellationToken ct = default) { var character = _game.Character; var packet = packetArgs.Packet; if (character is not null && character.Position is not null) { var oldPosition = new Position { X = character.Position.X, Y = character.Position.Y }; character.Position.X = packet.PositionX; character.Position.Y = packet.PositionY; return await _eventDispatcher.DispatchEvent ( new MovedEvent(character, character.Id, oldPosition, character.Position), ct ); } else if (character?.Position is null) { await _game.CreateOrUpdateCharacterAsync ( () => new Character ( Position: new Position() { X = packet.PositionX, Y = packet.PositionY } ), (c) => c with { Position = new Position() { X = packet.PositionX, Y = packet.PositionY } }, ct: ct ); } return Result.FromSuccess(); } }