aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/server/game/Entities/GameObject/GameObject.cpp4
-rw-r--r--src/server/game/Entities/GameObject/GameObject.h2
-rw-r--r--src/server/game/Entities/Object/Object.cpp12
-rw-r--r--src/server/game/Entities/Object/Object.h4
-rw-r--r--src/server/game/Entities/Player/Player.cpp4
-rw-r--r--src/server/game/Entities/Player/Player.h2
-rw-r--r--src/server/game/Spells/SpellInfo.cpp2
7 files changed, 15 insertions, 15 deletions
diff --git a/src/server/game/Entities/GameObject/GameObject.cpp b/src/server/game/Entities/GameObject/GameObject.cpp
index 44929448251..d7d4316975e 100644
--- a/src/server/game/Entities/GameObject/GameObject.cpp
+++ b/src/server/game/Entities/GameObject/GameObject.cpp
@@ -1240,12 +1240,12 @@ void GameObject::SaveRespawnTime(uint32 forceDelay)
}
}
-bool GameObject::IsNeverVisible() const
+bool GameObject::IsNeverVisible(bool allowServersideObjects) const
{
if (WorldObject::IsNeverVisible())
return true;
- if (GetGOInfo()->GetServerOnly())
+ if (GetGOInfo()->GetServerOnly() && !allowServersideObjects)
return true;
return false;
diff --git a/src/server/game/Entities/GameObject/GameObject.h b/src/server/game/Entities/GameObject/GameObject.h
index f3687c19154..470aed0a031 100644
--- a/src/server/game/Entities/GameObject/GameObject.h
+++ b/src/server/game/Entities/GameObject/GameObject.h
@@ -235,7 +235,7 @@ class TC_GAME_API GameObject : public WorldObject, public GridObject<GameObject>
void TriggeringLinkedGameObject(uint32 trapEntry, Unit* target);
- bool IsNeverVisible() const override;
+ bool IsNeverVisible(bool allowServersideObjects = false) const override;
bool IsAlwaysVisibleFor(WorldObject const* seer) const override;
bool IsInvisibleDueToDespawn() const override;
diff --git a/src/server/game/Entities/Object/Object.cpp b/src/server/game/Entities/Object/Object.cpp
index 056ced889aa..55a1436e7cd 100644
--- a/src/server/game/Entities/Object/Object.cpp
+++ b/src/server/game/Entities/Object/Object.cpp
@@ -1543,12 +1543,12 @@ float WorldObject::GetSightRange(WorldObject const* target) const
return 0.0f;
}
-bool WorldObject::CanSeeOrDetect(WorldObject const* obj, bool ignoreStealth, bool distanceCheck, bool checkAlert) const
+bool WorldObject::CanSeeOrDetect(WorldObject const* obj, bool implicitDetect, bool distanceCheck, bool checkAlert) const
{
if (this == obj)
return true;
- if (obj->IsNeverVisible() || CanNeverSee(obj))
+ if (obj->IsNeverVisible(implicitDetect) || CanNeverSee(obj))
return false;
if (obj->IsAlwaysVisibleFor(this) || CanAlwaysSee(obj))
@@ -1630,7 +1630,7 @@ bool WorldObject::CanSeeOrDetect(WorldObject const* obj, bool ignoreStealth, boo
if (obj->IsInvisibleDueToDespawn())
return false;
- if (!CanDetect(obj, ignoreStealth, checkAlert))
+ if (!CanDetect(obj, implicitDetect, checkAlert))
return false;
return true;
@@ -1641,7 +1641,7 @@ bool WorldObject::CanNeverSee(WorldObject const* obj) const
return GetMap() != obj->GetMap() || !InSamePhase(obj);
}
-bool WorldObject::CanDetect(WorldObject const* obj, bool ignoreStealth, bool checkAlert) const
+bool WorldObject::CanDetect(WorldObject const* obj, bool implicitDetect, bool checkAlert) const
{
WorldObject const* seer = this;
@@ -1661,10 +1661,10 @@ bool WorldObject::CanDetect(WorldObject const* obj, bool ignoreStealth, bool che
if (obj->IsAlwaysDetectableFor(seer))
return true;
- if (!ignoreStealth && !seer->CanDetectInvisibilityOf(obj))
+ if (!implicitDetect && !seer->CanDetectInvisibilityOf(obj))
return false;
- if (!ignoreStealth && !seer->CanDetectStealthOf(obj, checkAlert))
+ if (!implicitDetect && !seer->CanDetectStealthOf(obj, checkAlert))
return false;
return true;
diff --git a/src/server/game/Entities/Object/Object.h b/src/server/game/Entities/Object/Object.h
index f1fd3825eca..77006b47768 100644
--- a/src/server/game/Entities/Object/Object.h
+++ b/src/server/game/Entities/Object/Object.h
@@ -377,7 +377,7 @@ class TC_GAME_API WorldObject : public Object, public WorldLocation
float GetGridActivationRange() const;
float GetVisibilityRange() const;
float GetSightRange(WorldObject const* target = nullptr) const;
- bool CanSeeOrDetect(WorldObject const* obj, bool ignoreStealth = false, bool distanceCheck = false, bool checkAlert = false) const;
+ bool CanSeeOrDetect(WorldObject const* obj, bool implicitDetect = false, bool distanceCheck = false, bool checkAlert = false) const;
FlaggedValuesArray32<int32, uint32, StealthType, TOTAL_STEALTH_TYPES> m_stealth;
FlaggedValuesArray32<int32, uint32, StealthType, TOTAL_STEALTH_TYPES> m_stealthDetect;
@@ -550,7 +550,7 @@ class TC_GAME_API WorldObject : public Object, public WorldLocation
void SetLocationMapId(uint32 _mapId) { m_mapId = _mapId; }
void SetLocationInstanceId(uint32 _instanceId) { m_InstanceId = _instanceId; }
- virtual bool IsNeverVisible() const { return !IsInWorld(); }
+ virtual bool IsNeverVisible(bool allowServersideObjects = false) const { return !IsInWorld(); }
virtual bool IsAlwaysVisibleFor(WorldObject const* /*seer*/) const { return false; }
virtual bool IsInvisibleDueToDespawn() const { return false; }
//difference from IsAlwaysVisibleFor: 1. after distance check; 2. use owner or charmer as seer
diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp
index 9f11d2e92ab..46af30991fc 100644
--- a/src/server/game/Entities/Player/Player.cpp
+++ b/src/server/game/Entities/Player/Player.cpp
@@ -22345,9 +22345,9 @@ bool Player::HaveAtClient(Object const* u) const
return u == this || m_clientGUIDs.find(u->GetGUID()) != m_clientGUIDs.end();
}
-bool Player::IsNeverVisible() const
+bool Player::IsNeverVisible(bool allowServersideObjects) const
{
- if (Unit::IsNeverVisible())
+ if (Unit::IsNeverVisible(allowServersideObjects))
return true;
if (GetSession()->PlayerLogout() || GetSession()->PlayerLoading())
diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h
index a7d6a5551fc..3aacdbb295a 100644
--- a/src/server/game/Entities/Player/Player.h
+++ b/src/server/game/Entities/Player/Player.h
@@ -2026,7 +2026,7 @@ class TC_GAME_API Player : public Unit, public GridObject<Player>
bool HaveAtClient(Object const* u) const;
- bool IsNeverVisible() const override;
+ bool IsNeverVisible(bool allowServersideObjects = false) const override;
bool IsVisibleGloballyFor(Player const* player) const;
diff --git a/src/server/game/Spells/SpellInfo.cpp b/src/server/game/Spells/SpellInfo.cpp
index b8fc1af8931..56d8c741cdd 100644
--- a/src/server/game/Spells/SpellInfo.cpp
+++ b/src/server/game/Spells/SpellInfo.cpp
@@ -1609,7 +1609,7 @@ SpellCastResult SpellInfo::CheckTarget(WorldObject const* caster, WorldObject co
if (HasAttribute(SPELL_ATTR1_CANT_TARGET_SELF) && caster == target)
return SPELL_FAILED_BAD_TARGETS;
- // check visibility - ignore stealth for implicit (area) targets
+ // check visibility - ignore invisibility/stealth for implicit (area) targets
if (!HasAttribute(SPELL_ATTR6_CAN_TARGET_INVISIBLE) && !caster->CanSeeOrDetect(target, implicit))
return SPELL_FAILED_BAD_TARGETS;