109 lines
No EOL
3 KiB
C#
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();
|
|
}
|
|
} |