server-master/srcs/_plugins/WingsEmu.Plugins.BasicImplementation/Event/Characters/BattleEntityHealEventHandler.cs
2026-02-10 18:21:30 +01:00

82 lines
No EOL
2.8 KiB
C#

using System.Threading;
using System.Threading.Tasks;
using PhoenixLib.Events;
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.Game.Mates;
using WingsEmu.Game.Mates.Events;
using WingsEmu.Game.Networking;
using WingsEmu.Packets.Enums;
namespace WingsEmu.Plugins.BasicImplementations.Event.Characters;
public class BattleEntityHealEventHandler : IAsyncEventProcessor<BattleEntityHealEvent>
{
public async Task HandleAsync(BattleEntityHealEvent e, CancellationToken cancellation)
{
IBattleEntity battleEntity = e.Entity;
if (!battleEntity.IsAlive())
{
return;
}
int maxHp = battleEntity.MaxHp;
int maxMp = battleEntity.MaxMp;
int hpHeal = battleEntity.Hp + e.HpHeal > maxHp ? maxHp - battleEntity.Hp : e.HpHeal;
int mpHeal = battleEntity.Mp + e.MpHeal > maxMp ? maxMp - battleEntity.Mp : e.MpHeal;
(int hpToDecrease, int _) =
battleEntity.BCardComponent.GetAllBCardsInformation(BCardType.DamageConvertingSkill, (byte)AdditionalTypes.DamageConvertingSkill.HPRecoveryDecreased, battleEntity.Level);
(int hpToIncrease, int _) =
battleEntity.BCardComponent.GetAllBCardsInformation(BCardType.DamageConvertingSkill, (byte)AdditionalTypes.DamageConvertingSkill.HPRecoveryIncreased, battleEntity.Level);
int hpToChange = hpToIncrease - hpToDecrease;
hpHeal = (int)(hpHeal * (1 + hpToChange / 100.0));
battleEntity.Hp += hpHeal;
battleEntity.Mp += mpHeal;
battleEntity.BroadcastHeal(hpHeal);
if (battleEntity is not IPlayerEntity playerEntity)
{
return;
}
IClientSession session = playerEntity.Session;
session.RefreshStat();
session.RefreshStatInfo();
if (!e.HealMates)
{
return;
}
foreach (IMateEntity mate in session.PlayerEntity.MateComponent.TeamMembers())
{
(int mateHpToDecrease, int _) =
mate.BCardComponent.GetAllBCardsInformation(BCardType.DamageConvertingSkill, (byte)AdditionalTypes.DamageConvertingSkill.HPRecoveryDecreased, mate.Level);
(int mateHpToIncrease, int _) =
mate.BCardComponent.GetAllBCardsInformation(BCardType.DamageConvertingSkill, (byte)AdditionalTypes.DamageConvertingSkill.HPRecoveryIncreased, mate.Level);
int mateHpToChange = mateHpToDecrease - mateHpToIncrease;
int mateHpHeal = (int)(e.HpHeal * (1 + mateHpToChange / 100.0));
await session.EmitEventAsync(new MateHealEvent
{
MateEntity = mate,
HpHeal = mateHpHeal,
MpHeal = e.MpHeal
});
}
}
}