Le detaunt
Posted: 13 Jan 2010, 19:44
Lors d'une MaJ, il a été dit que "- On ne peut plus utiliser le detaunt pour éviter d'aggro un mob."
C'est très bien, ça évite le bug use, mais le problème, c'est que depuis, le detaunt ne sert à rien d'autre qu'augmenter le bonus de défense (j'ai à maintes reprises repris l'aggro alors que je ne faisais que detaunt).
Je suis allé voir dans le code de DoL rev 700 et j'y ai vu ceci :
GameServer/spells/StyleTaunt.cs
GameServer/ai/brain/IAggressiveBrain.cs est une interface. Les classes qui implémentent cette interface sont GameServer/ai/brain/StandardMobBrain.cs ou d'autres classes héritant de celle-ci.
Dans GameServer/ai/brain/StandardMobBrain.cs :
Je propose donc de mettre à la place de ce "m_aggroTable.Remove(living);" une ligne qui fait prendre un poil plus d'aggro que ceux qui n'ont encore rien fait dans le groupe (ni attaque, ni assistance) : "m_aggroTable[living] = 2L;"
Je pense que cela devrait régler le problème.
Le seul risque que je vois est qu'il devienne impossible de semer les mobs. J'ai vaguement regardé mais je n'ai pas l'impression que cela sera le cas. Le plus simple serait de tester.
C'est très bien, ça évite le bug use, mais le problème, c'est que depuis, le detaunt ne sert à rien d'autre qu'augmenter le bonus de défense (j'ai à maintes reprises repris l'aggro alors que je ne faisais que detaunt).
Je suis allé voir dans le code de DoL rev 700 et j'y ai vu ceci :
GameServer/spells/StyleTaunt.cs
Code: Select all
public override void OnDirectEffect(GameLiving target, double effectiveness)
{
if (target is GameNPC)
{
AttackData ad = Caster.TempProperties.getObjectProperty(GameLiving.LAST_ATTACK_DATA, null) as AttackData;
if (ad != null)
{
IAggressiveBrain aggroBrain = ((GameNPC)target).Brain as IAggressiveBrain;
if (aggroBrain != null)
{
int aggro = Convert.ToInt32(ad.Damage * this.Spell.Value * target.AttackSpeed(ad.Weapon) / 4000);
aggroBrain.AddToAggroList(Caster, aggro);//<------------------ C'est la procédure qui gère l'augmentation/diminution d'aggro.
//log.Info("Taunt amount: " + aggro.ToString());
}
}
}
}
Dans GameServer/ai/brain/StandardMobBrain.cs :
Code: Select all
public virtual void AddToAggroList(GameLiving living, int aggroamount)
{
(...)
if (m_aggroTable[living] != null)
{
long amount = (long)m_aggroTable[living];
amount += aggroamount;
if (amount <= 0)
{
m_aggroTable.Remove(living); // <---------------- On voit clairement qu'on est enlevé de la liste d'aggro.
}
else
{
m_aggroTable[living] = amount;
}
}
else
{
if (aggroamount > 0)
{
m_aggroTable[living] = (long)aggroamount;
}
}
Je pense que cela devrait régler le problème.
Le seul risque que je vois est qu'il devienne impossible de semer les mobs. J'ai vaguement regardé mais je n'ai pas l'impression que cela sera le cas. Le plus simple serait de tester.