~ruther/NosSmooth

bc090b22699dd63aaddb7cf12b99c6c3d792c6ac — Rutherther 2 years ago 62d0a52
feat(game): handle null skill vnum in su packet responder
1 files changed, 22 insertions(+), 30 deletions(-)

M Core/NosSmooth.Game/PacketHandlers/Entities/SkillUsedResponder.cs
M Core/NosSmooth.Game/PacketHandlers/Entities/SkillUsedResponder.cs => Core/NosSmooth.Game/PacketHandlers/Entities/SkillUsedResponder.cs +22 -30
@@ 20,6 20,7 @@ using NosSmooth.Game.Events.Entities;
using NosSmooth.Game.Extensions;
using NosSmooth.Game.Helpers;
using NosSmooth.Packets.Client.Battle;
using NosSmooth.Packets.Enums;
using NosSmooth.Packets.Server.Battle;
using NosSmooth.Packets.Server.Skills;
using Remora.Results;


@@ 29,8 30,7 @@ namespace NosSmooth.Game.PacketHandlers.Entities;
/// <summary>
/// Responds to skill used packet.
/// </summary>
public class SkillUsedResponder : IPacketResponder<SuPacket>, IPacketResponder<SrPacket>,
    IPacketResponder<UseSkillPacket>
public class SkillUsedResponder : IPacketResponder<SuPacket>, IPacketResponder<SrPacket>
{
    private readonly Game _game;
    private readonly EventDispatcher _eventDispatcher;


@@ 85,9 85,9 @@ public class SkillUsedResponder : IPacketResponder<SuPacket>, IPacketResponder<S
        }

        Skill? skillEntity;
        if (caster is Character character && character.Skills is not null)
        if (packet.SkillVNum is not null && caster is Character character && character.Skills is not null)
        {
            var skillResult = character.Skills.TryGetSkillByVNum(packet.SkillVNum);
            var skillResult = character.Skills.TryGetSkillByVNum(packet.SkillVNum.Value);

            if (skillResult.IsDefined(out skillEntity))
            {


@@ 96,15 96,15 @@ public class SkillUsedResponder : IPacketResponder<SuPacket>, IPacketResponder<S
            }
            else
            {
                var skillInfoResult = await _infoService.GetSkillInfoAsync(packet.SkillVNum, ct);
                var skillInfoResult = await _infoService.GetSkillInfoAsync(packet.SkillVNum.Value, ct);
                skillEntity = new Skill
                    (packet.SkillVNum, null, skillInfoResult.IsSuccess ? skillInfoResult.Entity : null);
                    (packet.SkillVNum.Value, null, skillInfoResult.IsSuccess ? skillInfoResult.Entity : null);
            }
        }
        else
        else if (packet.SkillVNum is not null)
        {
            var skillInfoResult = await _infoService.GetSkillInfoAsync(packet.SkillVNum, ct);
            if (!skillInfoResult.IsSuccess)
            var skillInfoResult = await _infoService.GetSkillInfoAsync(packet.SkillVNum.Value, ct);
            if (!skillInfoResult.IsSuccess && packet.SkillVNum != 0)
            {
                _logger.LogWarning
                (


@@ 115,7 115,11 @@ public class SkillUsedResponder : IPacketResponder<SuPacket>, IPacketResponder<S
            }

            skillEntity = new Skill
                (packet.SkillVNum, null, skillInfoResult.IsSuccess ? skillInfoResult.Entity : null);
                (packet.SkillVNum.Value, null, skillInfoResult.IsSuccess ? skillInfoResult.Entity : null);
        }
        else
        {
            skillEntity = new Skill(-1, null, null);
        }

        var dispatchResult = await _eventDispatcher.DispatchEvent


@@ 134,13 138,20 @@ public class SkillUsedResponder : IPacketResponder<SuPacket>, IPacketResponder<S

        if (!packet.TargetIsAlive)
        {
            if (target is not ILivingEntity living || (living.Type is not(EntityType.Player or EntityType.Npc)))
            {
                map?.Entities?.RemoveEntity(target.Id);
            }

            target.Hp.Amount = 0;
            target.Hp.Percentage = 0;

            var diedResult = await _eventDispatcher.DispatchEvent(new EntityDiedEvent(target, skillEntity), ct);
            if (!diedResult.IsSuccess)
            {
                return dispatchResult.IsSuccess
                    ? diedResult
                    : new AggregateError(diedResult, dispatchResult);
                    : new AggregateError(diedResult, diedResult);
            }
        }



@@ 170,23 181,4 @@ public class SkillUsedResponder : IPacketResponder<SuPacket>, IPacketResponder<S

        return Result.FromSuccess();
    }

    /// <inheritdoc />
    public async Task<Result> Respond(PacketEventArgs<UseSkillPacket> packetArgs, CancellationToken ct = default)
    {
        var packet = packetArgs.Packet;
        var character = _game.Character;

        if (character is not null && character.Skills is not null)
        {
            var skillResult = character.Skills.TryGetSkillByCastId(packet.CastId);

            if (skillResult.IsDefined(out var skillEntity))
            {
                skillEntity.IsOnCooldown = true;
            }
        }

        return Result.FromSuccess();
    }
}
\ No newline at end of file

Do not follow this link