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

85 lines
No EOL
2.5 KiB
C#

// WingsEmu
//
// Developed by NosWings Team
using System;
using WingsEmu.DTOs.BCards;
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 BCardRecoveryAndDamagePercentHandler : IBCardEffectAsyncHandler
{
public BCardType HandledType => BCardType.RecoveryAndDamagePercent;
public void Execute(IBCardEffectContext ctx)
{
IBattleEntity sender = ctx.Sender;
IBattleEntity target = ctx.Target;
sender ??= target;
BCardDTO bCard = ctx.BCard;
int firstDataValue = bCard.FirstDataValue(sender.Level);
switch (ctx.BCard.SubType)
{
case (byte)AdditionalTypes.RecoveryAndDamagePercent.HPRecovered:
int heal = (int)(target.MaxHp * (firstDataValue * 0.01));
target.EmitEvent(new BattleEntityHealEvent
{
Entity = target,
HpHeal = heal
});
break;
case (byte)AdditionalTypes.RecoveryAndDamagePercent.HPReduced:
int damage = (int)(target.MaxHp * (firstDataValue * 0.01));
if (target.Hp - damage <= 1)
{
damage = Math.Abs(target.Hp - 1);
}
target.Hp -= damage;
if (damage == 0)
{
return;
}
target.BroadcastDamage(damage);
break;
case (byte)AdditionalTypes.RecoveryAndDamagePercent.MPRecovered:
int mpRegen = (int)(target.MaxMp * (firstDataValue * 0.01));
if (target.Mp + mpRegen > target.MaxMp)
{
target.Mp = target.MaxMp;
}
else
{
target.Mp += mpRegen;
}
break;
case (byte)AdditionalTypes.RecoveryAndDamagePercent.MPReduced:
int mpDamage = (int)(target.MaxMp * (firstDataValue * 0.01));
if (target.Mp - mpDamage <= 1)
{
mpDamage = Math.Abs(target.Mp - 1);
}
target.Mp -= mpDamage;
break;
}
if (target is not IPlayerEntity playerEntity)
{
return;
}
playerEntity.Session.RefreshStat();
}
}