From eee8e965e7f0d79b5c3cb5a3677fe245fd595521 Mon Sep 17 00:00:00 2001 From: Stoabrogga <38475780+Stoabrogga@users.noreply.github.com> Date: Wed, 8 May 2019 08:01:40 +0200 Subject: [PATCH] fix(Core): increase visibility distance of large game objects (#1788) --- .../game/Entities/GameObject/GameObject.cpp | 4 +++ .../game/Entities/GameObject/GameObject.h | 16 +++++++++++ src/server/game/Entities/Object/Object.cpp | 28 +++++++++++++++++-- src/server/game/Entities/Object/Object.h | 3 ++ 4 files changed, 48 insertions(+), 3 deletions(-) diff --git a/src/server/game/Entities/GameObject/GameObject.cpp b/src/server/game/Entities/GameObject/GameObject.cpp index cee784535..7d169412a 100644 --- a/src/server/game/Entities/GameObject/GameObject.cpp +++ b/src/server/game/Entities/GameObject/GameObject.cpp @@ -351,6 +351,10 @@ bool GameObject::Create(uint32 guidlow, uint32 name_id, Map* map, uint32 phaseMa LastUsedScriptID = GetGOInfo()->ScriptId; AIM_Initialize(); + // Check if GameObject is Large + if (goinfo->IsLargeGameObject()) + SetVisibilityDistanceOverride(true); + return true; } diff --git a/src/server/game/Entities/GameObject/GameObject.h b/src/server/game/Entities/GameObject/GameObject.h index 000da1361..259934748 100644 --- a/src/server/game/Entities/GameObject/GameObject.h +++ b/src/server/game/Entities/GameObject/GameObject.h @@ -524,6 +524,22 @@ struct GameObjectTemplate } } + bool IsLargeGameObject() const + { + switch (type) + { + case GAMEOBJECT_TYPE_BUTTON: return button.large != 0; + case GAMEOBJECT_TYPE_QUESTGIVER: return questgiver.large != 0; + case GAMEOBJECT_TYPE_GENERIC: return _generic.large != 0; + case GAMEOBJECT_TYPE_TRAP: return trap.large != 0; + case GAMEOBJECT_TYPE_SPELL_FOCUS: return spellFocus.large != 0; + case GAMEOBJECT_TYPE_GOOBER: return goober.large != 0; + case GAMEOBJECT_TYPE_SPELLCASTER: return spellcaster.large != 0; + case GAMEOBJECT_TYPE_CAPTURE_POINT: return capturePoint.large != 0; + default: return false; + } + } + bool IsGameObjectForQuests() const { return IsForQuests; diff --git a/src/server/game/Entities/Object/Object.cpp b/src/server/game/Entities/Object/Object.cpp index 4fcb82a96..1d0e3ea89 100644 --- a/src/server/game/Entities/Object/Object.cpp +++ b/src/server/game/Entities/Object/Object.cpp @@ -968,7 +968,7 @@ WorldObject::WorldObject(bool isWorldObject) : WorldLocation(), #ifdef ELUNA elunaEvents(NULL), #endif -LastUsedScriptID(0), m_name(""), m_isActive(false), m_isWorldObject(isWorldObject), m_zoneScript(NULL), +LastUsedScriptID(0), m_name(""), m_isActive(false), m_isVisibilityDistanceOverride(false), m_isWorldObject(isWorldObject), m_zoneScript(NULL), m_transport(NULL), m_currMap(NULL), m_InstanceId(0), m_phaseMask(PHASEMASK_NORMAL), m_notifyflags(0), m_executed_notifies(0) { @@ -1039,6 +1039,14 @@ void WorldObject::setActive(bool on) } } +void WorldObject::SetVisibilityDistanceOverride(bool isVisibilityDistanceOverride) +{ + if (GetTypeId() == TYPEID_PLAYER) + return; + + m_isVisibilityDistanceOverride = isVisibilityDistanceOverride; +} + void WorldObject::CleanupsBeforeDelete(bool /*finalCleanup*/) { if (IsInWorld()) @@ -1515,7 +1523,14 @@ float WorldObject::GetVisibilityRange() const if (isActiveObject() && !ToPlayer()) return MAX_VISIBILITY_DISTANCE; else if (GetTypeId() == TYPEID_GAMEOBJECT) - return IsInWintergrasp() ? VISIBILITY_DIST_WINTERGRASP+VISIBILITY_INC_FOR_GOBJECTS : GetMap()->GetVisibilityRange()+VISIBILITY_INC_FOR_GOBJECTS; + { + if (IsInWintergrasp()) + return VISIBILITY_DIST_WINTERGRASP+VISIBILITY_INC_FOR_GOBJECTS; + else if (IsVisibilityOverridden()) + return MAX_VISIBILITY_DISTANCE; + else + return GetMap()->GetVisibilityRange()+VISIBILITY_INC_FOR_GOBJECTS; + } else return IsInWintergrasp() ? VISIBILITY_DIST_WINTERGRASP : GetMap()->GetVisibilityRange(); } @@ -1531,7 +1546,14 @@ float WorldObject::GetSightRange(const WorldObject* target) const if (target->isActiveObject() && !target->ToPlayer()) return MAX_VISIBILITY_DISTANCE; else if (target->GetTypeId() == TYPEID_GAMEOBJECT) - return IsInWintergrasp() && target->IsInWintergrasp() ? VISIBILITY_DIST_WINTERGRASP+VISIBILITY_INC_FOR_GOBJECTS : GetMap()->GetVisibilityRange()+VISIBILITY_INC_FOR_GOBJECTS; + { + if (IsInWintergrasp() && target->IsInWintergrasp()) + return VISIBILITY_DIST_WINTERGRASP+VISIBILITY_INC_FOR_GOBJECTS; + else if (target->IsVisibilityOverridden()) + return MAX_VISIBILITY_DISTANCE; + else + return GetMap()->GetVisibilityRange()+VISIBILITY_INC_FOR_GOBJECTS; + } return IsInWintergrasp() && target->IsInWintergrasp() ? VISIBILITY_DIST_WINTERGRASP : GetMap()->GetVisibilityRange(); } diff --git a/src/server/game/Entities/Object/Object.h b/src/server/game/Entities/Object/Object.h index 4035ed124..c30c7db0b 100644 --- a/src/server/game/Entities/Object/Object.h +++ b/src/server/game/Entities/Object/Object.h @@ -974,6 +974,8 @@ class WorldObject : public Object, public WorldLocation bool isActiveObject() const { return m_isActive; } void setActive(bool isActiveObject); + bool IsVisibilityOverridden() const { return m_isVisibilityDistanceOverride; } + void SetVisibilityDistanceOverride(bool isVisibilityDistanceOverride); void SetWorldObject(bool apply); bool IsPermanentWorldObject() const { return m_isWorldObject; } bool IsWorldObject() const; @@ -1018,6 +1020,7 @@ class WorldObject : public Object, public WorldLocation protected: std::string m_name; bool m_isActive; + bool m_isVisibilityDistanceOverride; const bool m_isWorldObject; ZoneScript* m_zoneScript;