177 lines
No EOL
6.7 KiB
C#
177 lines
No EOL
6.7 KiB
C#
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 BCardKnockdownHandler : IBCardEffectAsyncHandler
|
|
{
|
|
private readonly IBuffFactory _buffFactory;
|
|
private readonly ICardsManager _cards;
|
|
private readonly IGameLanguageService _gameLanguage;
|
|
private readonly IRandomGenerator _randomGenerator;
|
|
|
|
public BCardKnockdownHandler(IRandomGenerator randomGenerator, IBuffFactory buffFactory, ICardsManager cards, IGameLanguageService gameLanguage)
|
|
{
|
|
_randomGenerator = randomGenerator;
|
|
_buffFactory = buffFactory;
|
|
_cards = cards;
|
|
_gameLanguage = gameLanguage;
|
|
}
|
|
|
|
public BCardType HandledType => BCardType.TauntSkill;
|
|
|
|
public void Execute(IBCardEffectContext ctx)
|
|
{
|
|
IBattleEntity sender = ctx.Sender;
|
|
IBattleEntity target = ctx.Target;
|
|
byte subType = ctx.BCard.SubType;
|
|
int firstData = ctx.BCard.FirstData;
|
|
int secondData = ctx.BCard.SecondData;
|
|
|
|
if (_randomGenerator.RandomNumber() > firstData)
|
|
{
|
|
return;
|
|
}
|
|
|
|
switch (subType)
|
|
{
|
|
case (byte)AdditionalTypes.TauntSkill.TauntWhenKnockdown:
|
|
if (!target.BuffComponent.HasBuff((short)BuffVnums.KNOCKDOWN))
|
|
{
|
|
return;
|
|
}
|
|
|
|
Buff b = _buffFactory.CreateBuff(secondData, target);
|
|
|
|
double debuffCounter = target.CheckForResistance(b, _cards, out double buffCounter, out double specializedResistance);
|
|
|
|
int debuffRandomNumber = _randomGenerator.RandomNumber();
|
|
int buffRandomNumber = _randomGenerator.RandomNumber();
|
|
int specializedRandomNumber = _randomGenerator.RandomNumber();
|
|
switch (target)
|
|
{
|
|
case IMonsterEntity monster:
|
|
if (!monster.CanBeDebuffed)
|
|
{
|
|
return;
|
|
}
|
|
|
|
break;
|
|
}
|
|
|
|
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;
|
|
}
|
|
}
|
|
|
|
target.AddBuffAsync().ConfigureAwait(false).GetAwaiter().GetResult();
|
|
break;
|
|
|
|
case (byte)AdditionalTypes.TauntSkill.TauntWhenNormal:
|
|
if (target.BuffComponent.HasBuff((short)BuffVnums.KNOCKDOWN))
|
|
{
|
|
return;
|
|
}
|
|
|
|
b = _buffFactory.CreateBuff(secondData, target);
|
|
|
|
debuffCounter = target.CheckForResistance(b, _cards, out buffCounter, out specializedResistance);
|
|
debuffRandomNumber = _randomGenerator.RandomNumber();
|
|
buffRandomNumber = _randomGenerator.RandomNumber();
|
|
specializedRandomNumber = _randomGenerator.RandomNumber();
|
|
switch (target)
|
|
{
|
|
case IMonsterEntity monster:
|
|
if (!monster.CanBeDebuffed)
|
|
{
|
|
return;
|
|
}
|
|
|
|
break;
|
|
}
|
|
|
|
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;
|
|
}
|
|
}
|
|
|
|
target.AddBuffAsync().ConfigureAwait(false).GetAwaiter().GetResult();
|
|
break;
|
|
}
|
|
}
|
|
} |