diff options
author | Shauren <shauren.trinity@gmail.com> | 2021-03-28 16:38:04 +0200 |
---|---|---|
committer | Shauren <shauren.trinity@gmail.com> | 2024-10-05 16:55:58 +0200 |
commit | cb9b34d906108146e6571d349abb8da3ea4a8c6f (patch) | |
tree | 65826c18603f2fbcd68b76a8bcd7648ec536a070 /src | |
parent | 262a1e5b36dfea97f2dfc4b838dd3d59c6ed2fb3 (diff) |
Core/Objects: Refactor private object checks into separate function
(cherry picked from commit f21270b987211041b95d6befa7192d313692920d)
Diffstat (limited to 'src')
-rw-r--r-- | src/server/game/Combat/ThreatManager.cpp | 2 | ||||
-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 | 7 |
4 files changed, 27 insertions, 5 deletions
diff --git a/src/server/game/Combat/ThreatManager.cpp b/src/server/game/Combat/ThreatManager.cpp index 8263fcc3365..502031712c4 100644 --- a/src/server/game/Combat/ThreatManager.cpp +++ b/src/server/game/Combat/ThreatManager.cpp @@ -376,7 +376,7 @@ void ThreatManager::AddThreat(Unit* target, float amount, SpellInfo const* spell } // If victim is personal spawn, redirect all aggro to summoner - if (target->IsPrivateObject() && GetOwner()->IsPrivateObject() && GetOwner()->CanSeeOrDetect(target)) + if (target->IsPrivateObject() && (!GetOwner()->IsPrivateObject() || !GetOwner()->CheckPrivateObjectOwnerVisibility(target))) { if (Unit* privateObjectOwner = ObjectAccessor::GetUnit(*GetOwner(), target->GetPrivateObjectOwner())) { diff --git a/src/server/game/Entities/Object/Object.cpp b/src/server/game/Entities/Object/Object.cpp index 5e94549bc60..8f7a0f4e174 100644 --- a/src/server/game/Entities/Object/Object.cpp +++ b/src/server/game/Entities/Object/Object.cpp @@ -1542,20 +1542,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 implicitDetect, bool distanceCheck, bool checkAlert) const { if (this == obj) return true; - if (!obj->GetPrivateObjectOwner().IsEmpty()) - return GetGUID() == obj->GetPrivateObjectOwner() || GetPrivateObjectOwner() == obj->GetPrivateObjectOwner(); - if (obj->IsNeverVisible(implicitDetect) || 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 54c9267f45a..81c20ac1462 100644 --- a/src/server/game/Entities/Object/Object.h +++ b/src/server/game/Entities/Object/Object.h @@ -550,6 +550,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 3f715d0eb5a..3603c2667e2 100644 --- a/src/server/game/Grids/Notifiers/GridNotifiers.h +++ b/src/server/game/Grids/Notifiers/GridNotifiers.h @@ -1375,7 +1375,12 @@ namespace Trinity bool operator()(Creature* u) { - if (u->getDeathState() != DEAD && u->GetEntry() == i_entry && u->IsAlive() == i_alive && u->GetGUID() != i_obj.GetGUID() && i_obj.IsWithinDistInMap(u, i_range) && u->CanSeeOrDetect(&i_obj)) + if (u->getDeathState() != DEAD + && u->GetEntry() == i_entry + && u->IsAlive() == i_alive + && u->GetGUID() != i_obj.GetGUID() + && 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; |