server-master/srcs/_plugins/WingsEmu.Plugins.BasicImplementation/BCards/Handlers/BCardHideHandler.cs
2026-02-10 18:21:30 +01:00

98 lines
No EOL
3.3 KiB
C#

using System;
using System.Collections.Generic;
using PhoenixLib.Events;
using WingsEmu.Game;
using WingsEmu.Game.Battle;
using WingsEmu.Game.Buffs;
using WingsEmu.Game.Characters;
using WingsEmu.Game.Entities;
using WingsEmu.Game.Extensions;
using WingsEmu.Game.Helpers.Damages;
using WingsEmu.Game.Managers.StaticData;
using WingsEmu.Game.Monster.Event;
using WingsEmu.Game.Skills;
using WingsEmu.Packets.Enums;
namespace WingsEmu.Plugins.BasicImplementations.BCards.Handlers;
public class BCardHideHandler : IBCardEffectAsyncHandler
{
private readonly IAsyncEventPipeline _eventPipeline;
private readonly INpcMonsterManager _npcMonsterManager;
private readonly ISpyOutManager _spyOutManager;
public BCardHideHandler(IAsyncEventPipeline eventPipeline, ISpyOutManager spyOutManager, INpcMonsterManager npcMonsterManager)
{
_eventPipeline = eventPipeline;
_spyOutManager = spyOutManager;
_npcMonsterManager = npcMonsterManager;
}
public BCardType HandledType => BCardType.FalconSkill;
public void Execute(IBCardEffectContext ctx)
{
IBattleEntity sender = ctx.Sender;
IBattleEntity target = ctx.Target;
byte subType = ctx.BCard.SubType;
switch (subType)
{
case (byte)AdditionalTypes.FalconSkill.Hide:
if (target is not IPlayerEntity character)
{
return;
}
character.CharacterInvisible(true);
break;
case (byte)AdditionalTypes.FalconSkill.Ambush:
if (target is not IPlayerEntity characterAmbush)
{
return;
}
characterAmbush.CharacterInvisible();
break;
case (byte)AdditionalTypes.FalconSkill.CausingChanceLocation:
var summons = new List<ToSummon>();
short x = ctx.Position.X;
short y = ctx.Position.Y;
if (x == 0 || y == 0)
{
x = sender.PositionX;
y = sender.PositionY;
}
IMonsterData monsterData = _npcMonsterManager.GetNpc(ctx.BCard.SecondData);
if (monsterData == null)
{
return;
}
summons.Add(new ToSummon
{
VNum = monsterData.MonsterVNum,
SpawnCell = new Position(x, y),
IsMoving = monsterData.CanWalk,
SummonChance = (byte)ctx.BCard.FirstData,
IsHostile = monsterData.RawHostility != (int)HostilityType.NOT_HOSTILE,
RemoveTick = true
});
_eventPipeline.ProcessEventAsync(new MonsterSummonEvent(sender.MapInstance, summons, sender)).ConfigureAwait(false).GetAwaiter().GetResult();
break;
case (byte)AdditionalTypes.FalconSkill.FalconFollowing:
if (sender is not IPlayerEntity spyOutCharacter)
{
return;
}
_spyOutManager.AddSpyOutSkill(spyOutCharacter.Id, spyOutCharacter.LastEntity.Item2, spyOutCharacter.LastEntity.Item1);
spyOutCharacter.SpyOutStart = DateTime.UtcNow;
break;
}
}
}