Saturday, January 21, 2006

Threat and Aggro

There was an extremely good post about threat and aggro on the WoW forums a couple days ago. Unfortunately, I can't find the post now, which is a real pity.

Update: Gitr found the post that I was referencing. Comments below have been corrected.

The poster undertook a series of experiments to quantify "threat" in WoW, and the post detailed his results. The main conclusions of his experiments were as follows:

Threat is cumulative: You accumulate threat throughout the entire fight. The longer the fight, the higher the threat totals are.

10% Barrier:To take aggro from someone, you must do 10% more threat than them. For example, if a mage has 100 threat, you need to do 110 threat before the mob switches to attack you. This means that the person with aggro may not be the person with the highest threat level. The barrier increases to 30% for a character at range.

Taunt: In addition to forcing the mob to attack you, taunt is a "threat-shortcut". When you taunt, it permanently gives you the threat level of the person with aggro. It also recalculates aggro for the mob, most likely giving the warrior aggro permanently.

In particular, the way Taunt works is interesting, especially on long fights. Taunt is essential for pulling a mob off someone, because it gives you a huge gain in threat in a very short time. However, paladins don't have a taunt, making it very hard for them to take over tanking a mob.

For example, consider a druid, priest, and off-tank warrior. The druid is tanking and generates 2000 threat, the priest is healing and has 1000 threat. The OT warrior has 250. The druid gets crit hard and dies. The mob attacks the priest. The OT taunts, and now has a threat level of 1000 and aggro from the mob.

Now consider the same scenario with a paladin as off-tank. The mob attacks the priest. The paladin is at 250 threat, and needs to get 850 more before the mob turns away from the priest. Odds are the priest is going down.

(Of course, a paladin would probably toss Blessing of Protection on the priest, causing the mob to turn it's attention to the paladin and giving the priest and paladin 10s to fix the situation. But BoP has a 5min cooldown, making it a bit unreliable.)

So a paladin needs to get as much threat on a mob as possible, because she lacks the instant threat gain of Taunt. Because paladin healing is fairly low-threat, the more a paladin heals, the worse her position becomes if she is suddenly called on to tank. Of course, the more a paladin heals, the less likely it is that the warrior will die and she need to tank. Trade-offs are what make life interesting.

Some Threat Values and Formulas | 1/14/2006 8:49:51 AM PST Quote this post Reply to this post It's often said that we will never be able to work out the way threat and hate lists and mobs' AI works, because it's too complicated and unknowable, that we'll only ever have crude approximations and guesses. I've conducted some decent, rigorous tests, and i have what i believe is a good list of hate values and explanations of gaining and losing aggro and the behaviour of taunt. I am also able to debunk a few myths about how threat works.

1) Definitions

We define "aggro" to be who the mob is attacking. We define "threat" to be a numeric value that each mob has towards each player on it's hate list. Note, as we shall soon see, even for a normal mob, the target who has aggro is not necessarily the player on it's threat list with the most threat.

We define arbitratily that 1 point of unmodified damage gives 1 point of threat.

2) How to gain aggro - the 10% barrier

Simply put, for a mob to change aggro to a new target, the new target must have over 10% more threat than the mob's current target. E.g. mob is attacking player x. x does 100 damage to mob, then stops. Player y starts hitting the mob. The mob will start attacking y when y does over 110 damage.

Proof: this is easy to demonstrate. Get two players both doing autoattack on a mob (not warriors of rogues; we'll see later they complicate things). Have player 1 do a certain amount of damage, then stop. Have player 2 keep attacking till he gets aggro. You have an upper and lower bound on the threat required to get aggro - 1 attack before he got aggro was not enough, but the attack that he got aggro was at least enough. With low damage attacks (i.e. fists only), you will get a very good value of 10%.

This is only a description of the normal mob targetting. Obviously there are mobs who will attack secondary targets with special abilities, ignoring their current threat / aggro.

3) Threat modifiers from Warrior Stances

In Battle Stance and Berserker Stance, all threat from a Warrior is multiplied by 80%. In defensive stance, the multiplier is 130%. With Defiance, it is 145%.

Proof: a simple modification of the above proof. Get a warrior to do, say, 1000 damage in defensive stance, without defiance. Get a non-warrior to take aggro with white damage. You will find it does not happen before 1430 damage. The warrior's 1000 damage caused 1300 threat in defensive stance, and the 10% barrier means you need more than 1430 to gain aggro.

4) Threat does not decay

Threat never, ever decays. Here is test data. Warrior does 83 damage on mob in battle stance, gains aggro. From above, we know it will take more than 83 * 0.8 * 1.1 = 73.04 threat to gain aggro. Warrior waits for 5 minutes getting beat on. Then mage starts attacking slowly. Mage does 73 damage, but does not gain aggro! Mage does another 2 damage, and does gain aggro. From the warrior's initial hit to losing aggro, the time taken was 496 seconds.

As an upper bound, assume maximal threat decay. i.e. the mage only needed 73.000000001 threat to gain aggro. Then the warrior's threat had decayed to 66.36363636, from 66.4. This means he went down to 99.945% threat in 496 seconds.

At this maximal rate of hate decay, the time taken for the warrior's threat to decay to 90% of the original value would be 26.5 hours. In fact, if a warrior logged in as soon as the server came online after the weekly reset and hit a mob, his threat would not decay to 50% before the server reset next week. I think this is enough to rule out threat decay.

5) Threat values for some warrior abilities

the following list is not exhaustive, but includes all the major tanking abilities.

Note: the following values are given in raw terms. In reality the warrior must have either a 1.3 or 0.8 or 1.45 modifier on these, depending on his stance and talents.

Note: * All abilities do not include threat generated by their damage. This will be discussed more later.

Each point of healing, when completely unmodified by talents, gives 0.5 threat. Replace the proof for (2) by the second person only healing.

Note: overhealing doesn't count, only the actual amount healed. This is easy to demonstrate.

Abilities that put "you gain x mana" in the combat log give 0.5 threat per point gained; life is the same. Examples would be drinking potions, but not natural regen, or the Shaman's mana spring totem.

Abilities that put "you gain x rage" in the combat log give 5 threat per point gained. However, this is not modified by warrior stance. Such abilities include bloodrage, improved blocking talent, unbridled wrath, and 5/8 Might.

Like healing, these only give threat if you are below the maximum.

7) Explaining Cop's 4.0 damage to heal ratio

Cop stated that in his tests, each point of damage by the warrior took approximately 4 points of healing by the priest, for the priest to get aggro. Here's how:

There is no threat associated with pulling. The smallest amouts of threat we could generate drew aggro from a body pull, no matter how long we waited after the pull. Pulling with damage did not effect the results of tests such as in section (2) at all.

9) Taunt

The behaviour of taunt appears at first randomised or complicated. For instance, if you taunt a mob off another player, then do nothing, the mob will go back to the player as soon as the debuff wears off. It appears to be giving temporary hate, then. The following experiment disproves this: take any class, do 1000 damage or so to a mob, then stop. Then have a warrior taunt the mob, taking no action until the debuff has worn off. The mob will return to the original player. Now have the warrior twiddle his thumbs, have a beer, read the paper, etc, for as long as he likes (not too long or his buddy will probably die). Then have the warrior deal white damage until he gains aggro. You will find that in defensive stance with defiance, the first hit over 69 damage will score the warrior aggro. With battle stance, still only 125 damage is needed.

The behaviour of taunt is surprisingly simple, once you remember the 10% rule. It will give you exactly the threat of the player on top of the threat list - but not the 10% needed for the mob to change aggro, only a temporary aggro from the debuff! If you do nothing, you will stay at 100% of the mob's old target's threat, and will lose aggro with the taunt debuff. With a relatively small effort, you can gain aggro.

The behaviour can be described as "temporary aggro, permament threat". It is easy to show that taunt does not give the warrior any constant amount of threat. Have player 1 body pull a mob, but do no damage to it. He now has 0 threat, but has aggro. Now have the warrior taunt, and do nothing. After the 3 seconds, the warrior will lose aggro. He is now on 0 threat, but does not have the more than 0 required to gain aggro, by the 10% rule.

10) Implications

a) Regaining aggro. Considering the 10% rule, if you lose aggro naturally, someone will have at least 110% of your current threat. To regain it, you need 10% of that, or 121% of your current threat, at an absolute minimum. So don't lose aggro, it's hard to get back! Not that you didn't already know this, but still.

b) Taunt is potentially your highest threat move, because it gives permanent threat. The longer other people have been beating on a mob while you were not, the more threat you will gain by taunting. But from the 10% rule, you will need to do a lot of work to get aggro if the mob has been attacked for a decent amount of time without you.

c) Heroic Strike should not be used as a primary threat ability. Suppose you are tanking a level 62 mob. Let's give him 8,000 ac raw, and even assume he has 5 sunders stacked, for 5750 final ac, so he will take 48.89% of damage. A 15% crit rate is balanced by the 10% penalty to damage in defensive stance, and a 10% chance of a glancing blow chance for 50% damage. Then you can expect the 138 damage from Heroic Strike to contribute 67.5 damage on average, for a total of 212 unmodified threat. This is still only 82% of the threat a sunder would give. Even with a 1.3 speed weapon, you will still do 94% the threat of sunder per time interval.

Best practice is to spam sunder, and use HS in between to soak up excess rage.

d) Revenge ftw. You can expect to do about 345 unmodified threat with Revenge, including damage, against the mob in the example above, which is exceptional for the low rage cost, even throwing in 10 for a shield block. However, there is a rage cost of shield block, in that you will block more attacks, so take less damage, so gain less rage from damage. Two blocks for 180 damage and you can say goodbye to another 4 rage.

e) Demo Shout ftl. Demoralising shout does one sixth the threat of a sunder. Even spammed in defensive stance with defiance, you're doing no more threat than 42dps on each mob. Besides picking up whelps in Onyxia and tanking panthers in the Panther boss encounter in ZG, i can't see a compelling reason to use this.

f) Shield Slam ftl. Given the 6 second cooldown, there is no improvement in threat per second by using shield slam. With shield slam: 3 sunders and 1 shield slam every 6 seconds. About 212 threat per second, unmodified. With the 30 rage from the shield slam you can cast 1 sunder and about 1.2 heroic strikes, assuming you have the talents (which you would with any shield slam build), and are losing 3 rage per Heroic Strike from lost white damage rage (i.e. assuming 90 modified damage per hit). The 4 sunders and 1.2 heroic strikes every 6 seconds gives about 215 threat per second.

The only improvement is if you are spamming both sunder and HS, and want even more threat. Suppose we have a 2.0 speed weapon, HS spam and sunder spam. That's about 280 unmodified tps. Changing one sunder for a shield slam gives us 318 unmodified. However, the same effect would be achieved by changing to a 1.4 speed weapon and casting HS more often. And these values aren't taking into account autoattack damage, which makes the margins comparatively smaller.

g) There's no amazing super secret randomised blizzard aggro algorithm. The concepts are simple and the values can be fitted with nice numbers. Even formulas for threat-reducing knockbacks can conceivably be worked out, if threat values are carefully monitored.