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

113 lines
No EOL
3.8 KiB
C#

using System;
using System.Collections.Generic;
using System.Linq;
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.Configurations;
using WingsEmu.Game.Entities;
using WingsEmu.Game.Entities.Event;
using WingsEmu.Game.Extensions;
using WingsEmu.Game.Extensions.Mates;
using WingsEmu.Game.Mates;
using WingsEmu.Game.Mates.Events;
using WingsEmu.Packets.Enums;
namespace WingsEmu.Plugins.BasicImplementations.BCards.Handlers;
public class BCardBeriosHandler : IBCardEffectAsyncHandler
{
private readonly IBuffFactory _buffFactory;
private readonly IAsyncEventPipeline _eventPipeline;
private readonly GameRevivalConfiguration _gameRevivalConfiguration;
public BCardBeriosHandler(IAsyncEventPipeline eventPipeline, GameRevivalConfiguration gameRevivalConfiguration, IBuffFactory buffFactory)
{
_eventPipeline = eventPipeline;
_gameRevivalConfiguration = gameRevivalConfiguration;
_buffFactory = buffFactory;
}
public BCardType HandledType => BCardType.LordBerios;
public void Execute(IBCardEffectContext ctx)
{
IBattleEntity sender = ctx.Sender;
BCardDTO bCard = ctx.BCard;
int firstDataValue = bCard.FirstDataValue(sender.Level);
int secondDataValue = bCard.SecondDataValue(sender.Level);
switch ((AdditionalTypes.LordBerios)ctx.BCard.SubType)
{
case AdditionalTypes.LordBerios.CauseDamage:
IEnumerable<IBattleEntity> toDamage = sender.GetEnemiesInRange(sender, (byte)firstDataValue).Take(50);
foreach (IBattleEntity entity in toDamage)
{
if (!entity.IsAlive())
{
continue;
}
int damage = (int)(entity.MaxHp * (secondDataValue * 0.01));
if (sender.ShouldSaveDefender(entity, damage, _gameRevivalConfiguration, _buffFactory).ConfigureAwait(false).GetAwaiter().GetResult())
{
continue;
}
if (entity.Hp - damage <= 0)
{
entity.Hp = 0;
entity.EmitEvent(new GenerateEntityDeathEvent
{
Entity = entity,
Attacker = sender
});
sender.BroadcastCleanSuPacket(entity, damage);
continue;
}
entity.Hp -= damage;
switch (entity)
{
case IPlayerEntity character:
character.LastDefence = DateTime.UtcNow;
character.Session.RefreshStat();
if (character.IsSitting)
{
character.Session.RestAsync(force: true);
}
break;
case IMateEntity mate:
mate.LastDefence = DateTime.UtcNow;
mate.Owner.Session.SendMateLife(mate);
if (mate.IsSitting)
{
mate.Owner.Session.EmitEvent(new MateRestEvent
{
MateEntity = mate,
Force = true
});
}
break;
}
sender.BroadcastCleanSuPacket(entity, damage);
}
break;
}
}
}