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

94 lines
No EOL
2.6 KiB
C#

using System.Threading;
using System.Threading.Tasks;
using PhoenixLib.Events;
using WingsEmu.Game._enum;
using WingsEmu.Game._ItemUsage.Configuration;
using WingsEmu.Game.Battle;
using WingsEmu.Game.Buffs;
using WingsEmu.Game.Buffs.Events;
using WingsEmu.Game.Extensions;
using WingsEmu.Game.Mates;
using WingsEmu.Game.Networking;
using WingsEmu.Game.Skills;
using WingsEmu.Packets.Enums;
namespace WingsEmu.Plugins.BasicImplementations.Event.Buffs;
public class BuffPartnerCheckEventHandler : IAsyncEventProcessor<BuffPartnerCheckEvent>
{
private readonly IBuffFactory _buffFactory;
private readonly IMateBuffConfigsContainer _mateBuffConfigsContainer;
private readonly ISpPartnerConfiguration _spPartner;
public BuffPartnerCheckEventHandler(ISpPartnerConfiguration spPartner, IBuffFactory buffFactory, IMateBuffConfigsContainer mateBuffConfigsContainer)
{
_spPartner = spPartner;
_buffFactory = buffFactory;
_mateBuffConfigsContainer = mateBuffConfigsContainer;
}
public async Task HandleAsync(BuffPartnerCheckEvent e, CancellationToken cancellation)
{
IClientSession session = e.Sender;
IMateEntity matePet = session.PlayerEntity.MateComponent.GetTeamMember(x => x.MateType == MateType.Pet);
if (matePet != null)
{
await session.AddPetBuff(matePet, _mateBuffConfigsContainer, _buffFactory);
}
IMateEntity mateEntity = session.PlayerEntity.MateComponent.GetTeamMember(x => x.MateType == MateType.Partner);
if (mateEntity == null)
{
return;
}
if (!mateEntity.IsUsingSp)
{
return;
}
SpPartnerInfo spInfo = _spPartner.GetByMorph(mateEntity.Specialist.GameItem.Morph);
if (spInfo == null)
{
return;
}
if (spInfo.BuffId == 0)
{
return;
}
if (session.PlayerEntity.BuffComponent.HasBuff(spInfo.BuffId))
{
return;
}
int sum = 0;
foreach (IBattleEntitySkill skill in mateEntity.Skills)
{
if (!(skill is PartnerSkill partnerSkill))
{
continue;
}
sum += partnerSkill.Rank;
}
if (sum == 0)
{
sum = 1;
}
else
{
sum /= 3;
}
if (sum < 1)
{
sum = 1;
}
await session.PlayerEntity.AddBuffAsync(_buffFactory.CreateBuff(spInfo.BuffId + (sum - 1), session.PlayerEntity, BuffFlag.PARTNER));
}
}