aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorTreeston <treeston.mmoc@gmail.com>2018-09-09 14:47:49 +0200
committerShauren <shauren.trinity@gmail.com>2021-10-26 23:51:34 +0200
commit35e53839291c3782acca46d2f88f84b86d6e15b1 (patch)
tree13a32483dbc23c640e9083b990ab5857c8675333 /src
parent26ca7b0fc2907f861d2cdbf1e8699b364518501b (diff)
Core/Threat: Properly sequence checking offline state _after_ adding the reference to the threat list. This ensures IsEngagedWith reports consistent values for downstack calls in Creature. Closes #22406.
(cherry picked from commit 9f1755dbf13d475a26741690ec5d6a340a7f4230)
Diffstat (limited to 'src')
-rw-r--r--src/server/game/Combat/ThreatManager.cpp8
-rw-r--r--src/server/game/Combat/ThreatManager.h6
2 files changed, 10 insertions, 4 deletions
diff --git a/src/server/game/Combat/ThreatManager.cpp b/src/server/game/Combat/ThreatManager.cpp
index 2f2351bb43f..d6d6378373e 100644
--- a/src/server/game/Combat/ThreatManager.cpp
+++ b/src/server/game/Combat/ThreatManager.cpp
@@ -397,9 +397,15 @@ void ThreatManager::AddThreat(Unit* target, float amount, SpellInfo const* spell
}
// ok, we're now in combat - create the threat list reference and push it to the respective managers
- ThreatReference* ref = new ThreatReference(this, target, amount);
+ ThreatReference* ref = new ThreatReference(this, target);
PutThreatListRef(target->GetGUID(), ref);
target->GetThreatManager().PutThreatenedByMeRef(_owner->GetGUID(), ref);
+
+ // afterwards, we evaluate whether this is an online reference (it might not be an acceptable target, but we need to add it to our threat list before we check!)
+ ref->UpdateOffline();
+ if (ref->IsOnline()) // ...and if the ref is online it also gets the threat it should have
+ ref->AddThreat(amount);
+
if (!_ownerEngaged)
{
Creature* cOwner = ASSERT_NOTNULL(_owner->ToCreature()); // if we got here the owner can have a threat list, and must be a creature!
diff --git a/src/server/game/Combat/ThreatManager.h b/src/server/game/Combat/ThreatManager.h
index eca5f45c804..decd9d0a26b 100644
--- a/src/server/game/Combat/ThreatManager.h
+++ b/src/server/game/Combat/ThreatManager.h
@@ -278,10 +278,10 @@ class TC_GAME_API ThreatReference
private:
static bool FlagsAllowFighting(Unit const* a, Unit const* b);
- ThreatReference(ThreatManager* mgr, Unit* victim, float amount) :
+ ThreatReference(ThreatManager* mgr, Unit* victim) :
_owner(reinterpret_cast<Creature*>(mgr->_owner)), _mgr(*mgr), _victim(victim),
- _online(ShouldBeOffline() ? ONLINE_STATE_OFFLINE : ShouldBeSuppressed() ? ONLINE_STATE_SUPPRESSED : ONLINE_STATE_ONLINE),
- _baseAmount(IsOnline() ? amount : 0.0f), _tempModifier(0), _taunted(TAUNT_STATE_NONE) { }
+ _online(ShouldBeSuppressed() ? ONLINE_STATE_SUPPRESSED : ONLINE_STATE_ONLINE),
+ _baseAmount(0.0f), _tempModifier(0), _taunted(TAUNT_STATE_NONE) { }
void UnregisterAndFree();