aboutsummaryrefslogtreecommitdiff
path: root/src/server/game/Combat
diff options
context:
space:
mode:
authorxinef1 <w.szyszko2@gmail.com>2017-01-21 14:46:32 +0100
committerShauren <shauren.trinity@gmail.com>2018-12-09 14:18:42 +0100
commit8573b651c8bb00612b161cc44664cbbb6dd16327 (patch)
tree29ddd43eaee53238dbbf1e8954e162cbc79a9cd2 /src/server/game/Combat
parent46c69df3a7cd3f863a7a3cca59a136a0a5cdec9d (diff)
Core/Units: Drop hostile world references that are out of our sight (fixes combat bug) (#18591)
(cherry-picked from ba6281bf429384a506aad5125bcc537eef5bfe77)
Diffstat (limited to 'src/server/game/Combat')
-rw-r--r--src/server/game/Combat/HostileRefManager.cpp20
-rw-r--r--src/server/game/Combat/HostileRefManager.h3
2 files changed, 23 insertions, 0 deletions
diff --git a/src/server/game/Combat/HostileRefManager.cpp b/src/server/game/Combat/HostileRefManager.cpp
index 98883f3ac70..bcea34d7e83 100644
--- a/src/server/game/Combat/HostileRefManager.cpp
+++ b/src/server/game/Combat/HostileRefManager.cpp
@@ -142,6 +142,26 @@ void HostileRefManager::deleteReferencesForFaction(uint32 faction)
}
//=================================================
+// delete all references out of specified range
+
+void HostileRefManager::deleteReferencesOutOfRange(float range)
+{
+ HostileReference* ref = getFirst();
+ range = range*range;
+ while (ref)
+ {
+ HostileReference* nextRef = ref->next();
+ Unit* owner = ref->GetSource()->GetOwner();
+ if (!owner->isActiveObject() && owner->GetExactDist2dSq(GetOwner()) > range)
+ {
+ ref->removeReference();
+ delete ref;
+ }
+ ref = nextRef;
+ }
+}
+
+//=================================================
// delete one reference, defined by Unit
void HostileRefManager::deleteReference(Unit* creature)
diff --git a/src/server/game/Combat/HostileRefManager.h b/src/server/game/Combat/HostileRefManager.h
index fc26d950e67..585d96b7443 100644
--- a/src/server/game/Combat/HostileRefManager.h
+++ b/src/server/game/Combat/HostileRefManager.h
@@ -53,6 +53,9 @@ class TC_GAME_API HostileRefManager : public RefManager<Unit, ThreatManager>
// Remove specific faction references
void deleteReferencesForFaction(uint32 faction);
+ // for combat bugs
+ void deleteReferencesOutOfRange(float range);
+
HostileReference* getFirst() { return ((HostileReference*) RefManager<Unit, ThreatManager>::getFirst()); }
void updateThreatTables();