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

144 lines
No EOL
5.1 KiB
C#

// WingsEmu
//
// Developed by NosWings Team
using WingsEmu.Game;
using WingsEmu.Game._enum;
using WingsEmu.Game._i18n;
using WingsEmu.Game.Battle;
using WingsEmu.Game.Buffs;
using WingsEmu.Game.Characters;
using WingsEmu.Game.Entities;
using WingsEmu.Game.Extensions;
using WingsEmu.Game.Managers.StaticData;
using WingsEmu.Packets.Enums;
using WingsEmu.Packets.Enums.Chat;
namespace WingsEmu.Plugins.BasicImplementations.BCards.Handlers;
public class BCardSpecialEffect2Handler : IBCardEffectAsyncHandler
{
private readonly IBuffFactory _buffFactory;
private readonly ICardsManager _cardsManager;
private readonly IGameLanguageService _gameLanguage;
private readonly IRandomGenerator _randomGenerator;
public BCardSpecialEffect2Handler(IRandomGenerator randomGenerator, ICardsManager cardsManager, IBuffFactory buffFactory, IGameLanguageService gameLanguage)
{
_randomGenerator = randomGenerator;
_cardsManager = cardsManager;
_buffFactory = buffFactory;
_gameLanguage = gameLanguage;
}
public BCardType HandledType => BCardType.SpecialEffects2;
public void Execute(IBCardEffectContext ctx)
{
if (!(ctx.Sender is IPlayerEntity character))
{
return;
}
IBattleEntity sender = ctx.Sender;
IBattleEntity target = ctx.Target;
switch ((AdditionalTypes.SpecialEffects2)ctx.BCard.SubType)
{
case AdditionalTypes.SpecialEffects2.FocusEnemy:
if (target is not IMonsterEntity monsterEntity)
{
return;
}
sender.MapInstance.AddEntityToTargets(monsterEntity, sender);
break;
case AdditionalTypes.SpecialEffects2.TeleportInRadius:
character.Session.SendGuriPacket(1, (byte)ctx.BCard.FirstData);
break;
case AdditionalTypes.SpecialEffects2.MainWeaponCausingChance:
case AdditionalTypes.SpecialEffects2.SecondaryWeaponCausingChance:
if (sender.IsSameEntity(target))
{
return;
}
Buff b = _buffFactory.CreateBuff(ctx.BCard.SecondData, sender);
if (b == null)
{
return;
}
double debuffCounter = target.CheckForResistance(b, _cardsManager, out double buffCounter, out double specializedResistance);
int randomNumber = _randomGenerator.RandomNumber();
int debuffRandomNumber = _randomGenerator.RandomNumber();
int buffRandomNumber = _randomGenerator.RandomNumber();
int specializedRandomNumber = _randomGenerator.RandomNumber();
switch (target)
{
case IMonsterEntity monster:
if (!monster.CanBeDebuffed)
{
return;
}
break;
}
if (b.CardId == (short)BuffVnums.MEMORIAL && sender.BuffComponent.HasBuff((short)BuffVnums.MEMORIAL))
{
return;
}
if (randomNumber > ctx.BCard.FirstData)
{
return;
}
if (specializedRandomNumber >= (int)(specializedResistance * 100))
{
if (!(target is IPlayerEntity c))
{
return;
}
string message = _gameLanguage.GetLanguage(GameDialogKey.BUFF_CHATMESSAGE_EFFECT_RESISTANCE, c.Session.UserLanguage);
c.Session.SendChatMessage(message, ChatMessageColorType.Buff);
return;
}
switch (b.BuffGroup)
{
case BuffGroup.Bad when debuffRandomNumber >= (int)(debuffCounter * 100):
{
if (!(target is IPlayerEntity c))
{
return;
}
string message = _gameLanguage.GetLanguage(GameDialogKey.BUFF_CHATMESSAGE_EFFECT_RESISTANCE, c.Session.UserLanguage);
c.Session.SendChatMessage(message, ChatMessageColorType.Buff);
return;
}
case BuffGroup.Good when buffRandomNumber >= (int)(buffCounter * 100):
{
if (!(target is IPlayerEntity c))
{
return;
}
string message = _gameLanguage.GetLanguage(GameDialogKey.BUFF_CHATMESSAGE_EFFECT_RESISTANCE, c.Session.UserLanguage);
c.Session.SendChatMessage(message, ChatMessageColorType.Buff);
return;
}
}
Buff buff = _buffFactory.CreateBuff(ctx.BCard.SecondData, sender);
target.AddBuffAsync(buff).ConfigureAwait(false).GetAwaiter().GetResult();
break;
}
}
}