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

134 lines
No EOL
4.1 KiB
C#

using System.Collections.Generic;
using PhoenixLib.Events;
using WingsEmu.DTOs.BCards;
using WingsEmu.Game;
using WingsEmu.Game._enum;
using WingsEmu.Game.Buffs;
using WingsEmu.Game.Characters;
using WingsEmu.Game.Characters.Events;
using WingsEmu.Game.Entities;
using WingsEmu.Game.Extensions;
using WingsEmu.Game.Helpers.Damages;
using WingsEmu.Game.Maps;
using WingsEmu.Game.Mates;
using WingsEmu.Game.Monster.Event;
using WingsEmu.Packets.Enums;
namespace WingsEmu.Plugins.BasicImplementations.BCards.Handlers;
public class BCardMateSummonHandler : IBCardEffectAsyncHandler
{
private readonly IAsyncEventPipeline _asyncEvent;
private readonly IRandomGenerator _randomGenerator;
public BCardMateSummonHandler(IRandomGenerator randomGenerator, IAsyncEventPipeline asyncEvent)
{
_randomGenerator = randomGenerator;
_asyncEvent = asyncEvent;
}
public BCardType HandledType => BCardType.SummonAndRecoverHP;
public void Execute(IBCardEffectContext ctx)
{
IBattleEntity sender = ctx.Sender;
BCardDTO bCard = ctx.BCard;
int firstData = bCard.FirstDataValue(sender.Level);
int secondData = bCard.SecondDataValue(sender.Level);
switch ((AdditionalTypes.SummonAndRecoverHP)bCard.SubType)
{
case AdditionalTypes.SummonAndRecoverHP.ChanceSummon:
if (_randomGenerator.RandomNumber() > firstData)
{
return;
}
if (sender is not IMateEntity mateEntity)
{
return;
}
IPlayerEntity owner = mateEntity.Owner;
if (owner == null)
{
return;
}
if (owner.MapInstance.Id != mateEntity.MapInstance.Id)
{
return;
}
int amount = _randomGenerator.RandomNumber(1, 4);
var monsters = new List<ToSummon>();
Position position = mateEntity.Position;
for (int i = 0; i < amount; i++)
{
int x = position.X + _randomGenerator.RandomNumber(-2, 2);
int y = position.Y + _randomGenerator.RandomNumber(-2, 2);
if (mateEntity.MapInstance.IsBlockedZone(x, y))
{
x = position.X;
y = position.Y;
}
var toSummon = new ToSummon
{
VNum = (short)secondData,
SpawnCell = new Position((short)x, (short)y),
IsMoving = true,
IsHostile = true
};
monsters.Add(toSummon);
}
_asyncEvent.ProcessEventAsync(new MonsterSummonEvent(owner.MapInstance, monsters, owner)).ConfigureAwait(false).GetAwaiter().GetResult();
break;
case AdditionalTypes.SummonAndRecoverHP.RestoreHP:
if (sender is not IMonsterEntity monsterEntity)
{
return;
}
if (!monsterEntity.SummonerId.HasValue)
{
return;
}
IMateEntity mate = monsterEntity.MapInstance.GetCharacterById(monsterEntity.SummonerId.Value)?.MateComponent.GetTeamMember(x => x.MateType == MateType.Pet);
if (mate == null)
{
return;
}
if (monsterEntity.MapInstance.Id != mate.MapInstance.Id)
{
return;
}
if (mate.Owner.IsOnVehicle)
{
return;
}
int toHeal = (int)(mate.MaxHp * (firstData * 0.01));
mate.EmitEvent(new BattleEntityHealEvent
{
Entity = mate,
HpHeal = toHeal
});
monsterEntity.BroadcastEffectTarget(mate, EffectType.MateHealByMonster);
break;
}
}
}