diff options
| author | Meji <alvaro.megias@outlook.com> | 2023-03-23 20:22:29 +0100 | 
|---|---|---|
| committer | Meji <alvaro.megias@outlook.com> | 2023-03-23 20:22:29 +0100 | 
| commit | 19ea4c416aa1f80798739546f6fd2e63699775d2 (patch) | |
| tree | 08b23fa76cbec14e559452a1a5812cf0245fa47f /src | |
| parent | c8f7dd13b844a25f8932e4dc419d985b4f680793 (diff) | |
Core/Spells: Allow implicit targeting of serverside WorldObjects (#28827)
(cherry picked from commit 5d5ca30b232586ad378671bf0ac8407495dea188)
Diffstat (limited to 'src')
| -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;  | 
