Page 1 of 1

Le detaunt

Posted: 13 Jan 2010, 19:44
by Magolorin
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

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());
					}
                }
            }
        }
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 :

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 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.

Re: Le detaunt

Posted: 18 Jan 2010, 13:35
by Magolorin
Serait-il possible de savoir ce qu'il en est ?

Ça ne doit pas être très long à modifier.

Si c'est pas bon, autant que je le sache que je continue à regarder.

Re: Le detaunt

Posted: 18 Jan 2010, 16:14
by Ashvins
Attends qu'un admin se penche la question.
C'est vrai qu'ils sont pas très efficaces actuellement les détaunts.

Re: Le detaunt

Posted: 29 Jan 2010, 21:29
by Magolorin
Quand puis-je espérer avoir une réponse ? Ça fait quand même plus de deux semaines là alors qu'il n'y a qu'une ligne de code à modifier.

Je résume si ça parait trop long, il suffit de changer la ligne 294 du fichier "StandardMobBrain.cs" :

Code: Select all

						m_aggroTable.Remove(living);
par

Code: Select all

						m_aggroTable[living] = 2L;
puis recompiler.

Qu'est-ce que ça change ?
Ça change qu'au lieu d'enlever de la liste d'aggro, ça laisse la personne dans la liste avec une valeur d'aggro juste supérieure à un autre membre du groupe qui n'aurait pas encore touché le mob ou soutenu un membre du groupe.

Re: Le detaunt

Posted: 29 Jan 2010, 22:07
by Nep
Magolorin wrote:Quand puis-je espérer avoir une réponse ?
Quand quelqu'un qui peut s'en occuper (Dre) sera disponible, ce qui n'est pas le cas pour le moment.

Re: Le detaunt

Posted: 06 Feb 2010, 19:47
by Nep
Bugfix:
- Detaunt qui detauntait pas

Re: Le detaunt

Posted: 06 Feb 2010, 21:51
by Magolorin
:)

Re: Le detaunt

Posted: 08 Feb 2010, 12:07
by Yactaff
bah tu vois =)