// // OutResponder.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.Data.Maps; using NosSmooth.Game.Events.Core; using NosSmooth.Game.Events.Entities; using NosSmooth.Game.Helpers; using NosSmooth.Packets.Server.Maps; using Remora.Results; namespace NosSmooth.Game.PacketHandlers.Map; /// /// Responds to out packet. /// public class OutResponder : IPacketResponder { private readonly Game _game; private readonly EventDispatcher _eventDispatcher; /// /// Initializes a new instance of the class. /// /// The game. /// The event dispatcher. public OutResponder(Game game, EventDispatcher eventDispatcher) { _game = game; _eventDispatcher = eventDispatcher; } /// public async Task Respond(PacketEventArgs packetArgs, CancellationToken ct = default) { var packet = packetArgs.Packet; var map = _game.CurrentMap; if (map is null) { return Result.FromSuccess(); } map.Entities.RemoveEntity(packet.EntityId); Portal? portal = null; IEntity entity = map.Entities.GetEntity(packet.EntityId) ?? EntityHelpers.CreateEntity (packet.EntityType, packet.EntityId); var position = entity.Position; if (entity is Player && position is not null) { map.IsOnPortal(position.Value, out portal); } bool? died = null; if (entity is ILivingEntity livingEntity) { died = (livingEntity.Hp?.Amount ?? -1) == 0 || (livingEntity.Hp?.Percentage ?? -1) == 0; } return await _eventDispatcher.DispatchEvent(new EntityLeftMapEvent(entity, portal, died), ct); } }