diff options
author | Shauren <shauren.trinity@gmail.com> | 2021-03-28 16:38:04 +0200 |
---|---|---|
committer | Shauren <shauren.trinity@gmail.com> | 2021-03-28 20:22:05 +0200 |
commit | f21270b987211041b95d6befa7192d313692920d (patch) | |
tree | a8fc30c2a472ca48d9499e41e1ba03d325a994f9 /src | |
parent | 1082a6645e96c611b3145b5d6208fc4db6e4b2d3 (diff) |
Core/Objects: Refactor private object checks into separate function
Diffstat (limited to 'src')
-rw-r--r-- | src/server/game/Combat/ThreatManager.cpp | 4 | ||||
-rw-r--r-- | src/server/game/Entities/Object/Object.cpp | 22 | ||||
-rw-r--r-- | src/server/game/Entities/Object/Object.h | 1 | ||||
-rw-r--r-- | src/server/game/Grids/Notifiers/GridNotifiers.h | 6 |
4 files changed, 27 insertions, 6 deletions
diff --git a/src/server/game/Combat/ThreatManager.cpp b/src/server/game/Combat/ThreatManager.cpp index 0816c971c8c..e3d5f054abb 100644 --- a/src/server/game/Combat/ThreatManager.cpp +++ b/src/server/game/Combat/ThreatManager.cpp @@ -453,8 +453,8 @@ void ThreatManager::doAddThreat(Unit* victim, float threat) uint32 redirectThreadPct = victim->GetRedirectThreatPercent(); Unit* redirectTarget = victim->GetRedirectThreatTarget(); - // If victim is personnal spawn, redirect all aggro to summoner - if (victim->IsPrivateObject() && GetOwner()->IsPrivateObject() && GetOwner()->CanSeeOrDetect(victim)) + // If victim is personal spawn, redirect all aggro to summoner + if (victim->IsPrivateObject() && (!GetOwner()->IsPrivateObject() || !GetOwner()->CheckPrivateObjectOwnerVisibility(victim))) { redirectThreadPct = 100; redirectTarget = ObjectAccessor::GetUnit(*GetOwner(), victim->GetPrivateObjectOwner()); diff --git a/src/server/game/Entities/Object/Object.cpp b/src/server/game/Entities/Object/Object.cpp index 009afbbf6b3..55d670b27f2 100644 --- a/src/server/game/Entities/Object/Object.cpp +++ b/src/server/game/Entities/Object/Object.cpp @@ -1411,20 +1411,36 @@ float WorldObject::GetSightRange(WorldObject const* target) const return 0.0f; } +bool WorldObject::CheckPrivateObjectOwnerVisibility(WorldObject const* seer) const +{ + if (!IsPrivateObject()) + return true; + + // Owner of this private object + if (_privateObjectOwner == seer->GetGUID()) + return true; + + // Another private object of the same owner + if (_privateObjectOwner == seer->GetPrivateObjectOwner()) + return true; + + return false; +} + bool WorldObject::CanSeeOrDetect(WorldObject const* obj, bool ignoreStealth, bool distanceCheck, bool checkAlert) const { if (this == obj) return true; - if (!obj->GetPrivateObjectOwner().IsEmpty()) - return GetGUID() == obj->GetPrivateObjectOwner() || GetPrivateObjectOwner() == obj->GetPrivateObjectOwner(); - if (obj->IsNeverVisibleFor(this) || CanNeverSee(obj)) return false; if (obj->IsAlwaysVisibleFor(this) || CanAlwaysSee(obj)) return true; + if (!obj->CheckPrivateObjectOwnerVisibility(this)) + return false; + bool corpseVisibility = false; if (distanceCheck) { diff --git a/src/server/game/Entities/Object/Object.h b/src/server/game/Entities/Object/Object.h index 3bd550d992e..f2402bfa6f3 100644 --- a/src/server/game/Entities/Object/Object.h +++ b/src/server/game/Entities/Object/Object.h @@ -599,6 +599,7 @@ class TC_GAME_API WorldObject : public Object, public WorldLocation bool IsPrivateObject() const { return !_privateObjectOwner.IsEmpty(); } ObjectGuid GetPrivateObjectOwner() const { return _privateObjectOwner; } void SetPrivateObjectOwner(ObjectGuid const& owner) { _privateObjectOwner = owner; } + bool CheckPrivateObjectOwnerVisibility(WorldObject const* seer) const; protected: std::string m_name; diff --git a/src/server/game/Grids/Notifiers/GridNotifiers.h b/src/server/game/Grids/Notifiers/GridNotifiers.h index f5d84862633..cf498800783 100644 --- a/src/server/game/Grids/Notifiers/GridNotifiers.h +++ b/src/server/game/Grids/Notifiers/GridNotifiers.h @@ -1313,7 +1313,11 @@ namespace Trinity bool operator()(Creature* u) { - if (u->getDeathState() != DEAD && u->GetEntry() == i_entry && u->IsAlive() == i_alive && i_obj.IsWithinDistInMap(u, i_range) && u->CanSeeOrDetect(&i_obj)) + if (u->getDeathState() != DEAD + && u->GetEntry() == i_entry + && u->IsAlive() == i_alive + && i_obj.IsWithinDistInMap(u, i_range) + && u->CheckPrivateObjectOwnerVisibility(&i_obj)) { i_range = i_obj.GetDistance(u); // use found unit range as new range limit for next check return true; |