aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/server/game/Combat/ThreatManager.cpp2
-rw-r--r--src/server/game/Entities/Object/Object.cpp22
-rw-r--r--src/server/game/Entities/Object/Object.h1
-rw-r--r--src/server/game/Grids/Notifiers/GridNotifiers.h7
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;