diff options
| -rw-r--r-- | src/server/game/Entities/GameObject/GameObject.cpp | 4 | ||||
| -rw-r--r-- | src/server/game/Entities/GameObject/GameObject.h | 2 | ||||
| -rw-r--r-- | src/server/game/Entities/Object/Object.cpp | 12 | ||||
| -rw-r--r-- | src/server/game/Entities/Object/Object.h | 4 | ||||
| -rw-r--r-- | src/server/game/Entities/Player/Player.cpp | 4 | ||||
| -rw-r--r-- | src/server/game/Entities/Player/Player.h | 2 | ||||
| -rw-r--r-- | src/server/game/Spells/SpellInfo.cpp | 2 |
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; |
