Jump to content
  • 0

[4.1.2] Mob stance, bad description or bug ?


Question

Posted (edited)

Hello,

 

1) Mob stance is related to engagement ? but it is not clear at all.

2) If not, there is a bug, I am "near" two ennemies and I have only 5 %. ("Each Nearby ennemy" tell the description)

 

Theorically, the system seems to work when I ENGAGE an ennemy or ennemies who engage me, or only nearby presence ?

 

Not clear at all.

 

 

Mob-stance.png

Edited by theBalthazar
  • Like 1

5 answers to this question

Recommended Posts

  • 0
Posted (edited)

Yeah, tooltip is indeed not clear enough.

 

 

Fyi there are 3 'related' status effect types:

- EngagedBy: Number of enemies currently engaging the target.

- EngagedTargets: Number of currently engaged targets.

- ThreatenedTargets: Number of currently threatened targets.

 

Mob Stance uses the last one.

But what is a "Threatened Enemy"?: it is a nearby enemy that AllowsIncomingThreat while you AllowOutgoingThreat and CanThreatenEnemy.

Sounds strange... but I don't want to invent new terms, and use those from Game/AIController.cs

 

So:

 

CanThreatenEnemy is if you satisfy the following conditions:

- enemy is within PotentialThreatRange, is targetable, is hostile and is not a pet

- you are not in stealth/invisible, and (you are not moving, unless the enemy is your current target)

- your attack is melee attack (although my current understanding is: if you engage an enemy1 in melee... even if you have only 1 engagement limit, this allows you to pass CanThreatenEnemy on adjacent enemies when you made that melee attack even if it was vs enemy1)

- EDIT: there is one more check (at the end of CanThreaten()): enemy must be within ThreatRange. And the difference between ThreatRange and PotentialThreatRange is that the first is 3m shorter.

 

AllowOutgoingThreat is if you:

- are not stunned, pushed back, paralyzed, terrified, knocked down, dead, unconscious, launched, grabbed are not currently in the process of using an object and are not in "InUseState" (whatever it means).

 

AllowsIncomingThreat is if enemy:

- is not pushed back, dead, unconscious, grabbed

 

Enemy is considered within PotentialThreatRange, if:

- distance_to_enemy <= 3 + your.mover.radius + enemy.mover.radius

- no idea what a mover is, but fallback value is 0.5f, and in characters.gamedatabundle you can see radius values usually being between 0.5f and 1.0f for human sized enemies (large dragons have 3.0f, and kraken looks to have the biggest: 6.0f).

 

Enemy is considered within ThreatRange, if:

- distance_to_enemy <= your.mover.radius + enemy.mover.radius

 

Now... put this is in tooltip :lol:

 

 

P.S. TL.DR: you can consider the following approximation for "threatened enemies": think of them as a list of nearby enemies in melee range. The list starts empty and gets refreshed when you engage / use a melee attack. Additionally enemies get removed from the list when they disengage, die, get pushed, or when you get invisible or hard-cc'ed.

The difference between threatened and engaged enemies - is that you can threaten an enemy without engaging him. For example you are attacking a higher-level barbarian (with Threatening Presense); you can't engage him, but are still threatening.

 

P.P.S. But that's theory, based on gamedatabundles and a piece of decompiled code. Better check in practice, if I didn't miss something.

Edited by MaxQuest
  • Like 2
  • 0
Posted (edited)

Yeah, tooltip is indeed not clear enough.

 

 

Fyi there are 3 'related' status effect types:

- EngagedBy: Number of enemies currently engaging the target.

- EngagedTargets: Number of currently engaged targets.

- ThreatenedTargets: Number of currently threatened targets.

 

Mob Stance uses the last one.

But what is a "Threatened Enemy"?: it is a nearby enemy that AllowsIncomingThreat while you AllowOutgoingThreat and CanThreatenEnemy.

Sounds strange... but I don't want to invent new terms, and use those from Game/AIController.cs

 

So:

 

CanThreatenEnemy is if you satisfy the following conditions:

- enemy is within PotentialThreatRange, is targetable, is hostile and is not a pet

- you are not in stealth/invisible, and (you are not moving, unless the enemy is your current target)

- your attack is melee attack (although my current understanding is: if you engage an enemy1 in melee... even if you have only 1 engagement limit, this allows you to pass CanThreatenEnemy on adjacent enemies when you made that melee attack even if it was vs enemy1)

 

AllowOutgoingThreat is if you:

- are not stunned, pushed back, paralyzed, terrified, knocked down, dead, unconscious, launched, grabbed are not currently in the process of using an object and are not in "InUseState" (whatever it means).

 

AllowsIncomingThreat is if enemy:

- is not pushed back, dead, unconscious, grabbed

 

Enemy is considered within PotentialThreatRange, if:

- distance_to_enemy <= 3 + your.mover.radius + enemy.mover.radius

- no idea what a mover is, but fallback value is 0.5f, and in characters.gamedatabundle you can see Radius value usually being between 0.5f and 1.0f.

 

Now... put this is in tooltip   :lol:

 

huh wow! I always thought "threatened by" in mob stance was simply another way to say "targets you are currently engaging". way to have a completely extra complicated layer! (and this explains what I thought was an apparent redundancy in the AI scripting).

 

edit: is it fair to say that an engaged target is one that is definitely being threatened - but a threatened target is not necessarily one that is engaged? a threatened target is someone that could be engaged, but for whatever reason may not be (not high enough engagement limit?)

Edited by thelee
  • 0
Posted (edited)

edit: is it fair to say that an engaged target is one that is definitely being threatened - but a threatened target is not necessarily one that is engaged? a threatened target is someone that could be engaged, but for whatever reason may not be (not high enough engagement limit?)

Absolutely :)

 

The first thing that CanEngageEnemy() method checks is: if (!this.CanThreatenEnemy(enemy, attack)) { return false; }

 

And yeap, a threatened enemy is, generally speaking, an enemy that could potentially be engaged by you.

Edited by MaxQuest
  • Like 2
  • 0
Posted (edited)

Small update. I have been going through this again. And there is a thing I have missed.

CanThreaten() method besides IsWithinPotentialThreatRange() also checks for IsWithinThreatRange(). And while the first check takes into account at least 4m distance... the last one is basically melee range (distance <= your.mover.radius + enemy.mover.radius).

 

Also I have checked from where is ThreatenEnemy() invoked.

And it is called from two places:

- when you engage an enemy

- and during UpdateEngagement routine, for currentEnemy that is attacked in melee

 

So in practice threatenedEnemies is almost the same as engagedEnemies, with the following exceptions:

- you can threaten your currentTarget in melee, even if your engagement limit is zero

- you can threaten your currentTarget in melee, even if you cannot engage it due to failing minimumLevelThatCanEngageMe check - e.g. when attacking a higher-level barbarian with Threatening Presence.

 

 

Thus:

- "Each nearby enemy reduced fighter's recovery time between attacks" - is incorrect

- "Each nearby enemy engaged by fighter, plus fighter's current target (if not already engaged), reduce fighter's recovery time between attacks" - is closer to what really happens

 

So:

- it would be nice to either adjust the description to match the effect.

- or adjust the effect to match the description.

Edited by MaxQuest
  • Like 1

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...