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

109 lines
No EOL
3 KiB
C#

// WingsEmu
//
// Developed by NosWings Team
using PhoenixLib.Events;
using WingsEmu.DTOs.BCards;
using WingsEmu.Game.Battle;
using WingsEmu.Game.Buffs;
using WingsEmu.Game.Characters;
using WingsEmu.Game.Characters.Events;
using WingsEmu.Game.Entities;
using WingsEmu.Game.Extensions;
using WingsEmu.Packets.Enums;
namespace WingsEmu.Plugins.BasicImplementations.BCards.Handlers;
public class BCardHealingBurningAndCastingHandler : IBCardEffectAsyncHandler
{
private readonly IAsyncEventPipeline _asyncEventPipeline;
public BCardHealingBurningAndCastingHandler(IAsyncEventPipeline asyncEventPipeline) => _asyncEventPipeline = asyncEventPipeline;
public BCardType HandledType => BCardType.HealingBurningAndCasting;
public void Execute(IBCardEffectContext ctx)
{
IBattleEntity target = ctx.Target;
IBattleEntity sender = ctx.Sender;
byte subType = ctx.BCard.SubType;
if (sender?.MapInstance == null)
{
return;
}
if (target?.MapInstance == null)
{
return;
}
BCardDTO bCard = ctx.BCard;
int firstDataValue = bCard.FirstDataValue(sender.Level);
if (!target.IsAlive())
{
return;
}
if (target.IsMateTrainer())
{
return;
}
switch ((AdditionalTypes.HealingBurningAndCasting)subType)
{
case AdditionalTypes.HealingBurningAndCasting.RestoreHP:
case AdditionalTypes.HealingBurningAndCasting.RestoreHPWhenCasting:
target.EmitEvent(new BattleEntityHealEvent
{
Entity = target,
HpHeal = firstDataValue
});
break;
case AdditionalTypes.HealingBurningAndCasting.RestoreMP:
if (target.Mp + firstDataValue < target.MaxMp)
{
target.Mp += firstDataValue;
}
else
{
target.Mp = target.MaxMp;
}
break;
case AdditionalTypes.HealingBurningAndCasting.DecreaseHP:
int damage = firstDataValue;
if (target.Hp - damage <= 0)
{
if (target.Hp != 1)
{
target.BroadcastDamage(target.Hp - 1);
}
target.Hp = 1;
}
else
{
target.BroadcastDamage(damage);
target.Hp -= damage;
}
break;
case AdditionalTypes.HealingBurningAndCasting.DecreaseMP:
int mpDecrease = firstDataValue;
target.Mp = target.Mp - mpDecrease <= 0 ? 1 : target.Mp - mpDecrease;
break;
}
if (target is not IPlayerEntity targetPlayer)
{
return;
}
targetPlayer.Session?.RefreshStat();
}
}