aboutsummaryrefslogtreecommitdiff
path: root/src/server/game/Entities/Object
diff options
context:
space:
mode:
authorKittnz <Kittnz@users.noreply.github.com>2019-01-16 20:47:25 +0100
committerGitHub <noreply@github.com>2019-01-16 20:47:25 +0100
commitd1c3ee957962897a8b323e8ca40302fc5ff8c932 (patch)
tree3172d2e387de6b2728ba7eb2700351ba2ad6740d /src/server/game/Entities/Object
parent583eba3688c1ab8a4c5de38e00939bc491411960 (diff)
Core/Objects: increase sight range of objects & correct general default visibility distance (#22891)
This can be used for anything really. Note: This does not make the object active. #21111 #21681
Diffstat (limited to 'src/server/game/Entities/Object')
-rw-r--r--src/server/game/Entities/Object/Object.cpp27
-rw-r--r--src/server/game/Entities/Object/Object.h4
-rw-r--r--src/server/game/Entities/Object/ObjectDefines.h37
3 files changed, 56 insertions, 12 deletions
diff --git a/src/server/game/Entities/Object/Object.cpp b/src/server/game/Entities/Object/Object.cpp
index 3909f76cd67..5087279adc0 100644
--- a/src/server/game/Entities/Object/Object.cpp
+++ b/src/server/game/Entities/Object/Object.cpp
@@ -47,6 +47,16 @@
#include "World.h"
#include <G3D/Vector3.h>
+constexpr float VisibilityDistances[AsUnderlyingType(VisibilityDistanceType::Max)] =
+{
+ DEFAULT_VISIBILITY_DISTANCE,
+ VISIBILITY_DISTANCE_TINY,
+ VISIBILITY_DISTANCE_SMALL,
+ VISIBILITY_DISTANCE_LARGE,
+ VISIBILITY_DISTANCE_GIGANTIC,
+ MAX_VISIBILITY_DISTANCE
+};
+
Object::Object() : m_PackGUID(sizeof(uint64)+1)
{
m_objectTypeId = TYPEID_OBJECT;
@@ -1022,6 +1032,15 @@ void WorldObject::SetFarVisible(bool on)
m_isFarVisible = on;
}
+void WorldObject::SetVisibilityDistanceOverride(VisibilityDistanceType type)
+{
+ ASSERT(type < VisibilityDistanceType::Max);
+ if (GetTypeId() == TYPEID_PLAYER)
+ return;
+
+ m_visibilityDistanceOverride = VisibilityDistances[AsUnderlyingType(type)];
+}
+
void WorldObject::CleanupsBeforeDelete(bool /*finalCleanup*/)
{
if (IsInWorld())
@@ -1459,7 +1478,9 @@ float WorldObject::GetGridActivationRange() const
float WorldObject::GetVisibilityRange() const
{
- if (IsFarVisible() && !ToPlayer())
+ if (IsVisibilityOverridden() && !ToPlayer())
+ return *m_visibilityDistanceOverride;
+ else if (IsFarVisible() && !ToPlayer())
return MAX_VISIBILITY_DISTANCE;
else
return GetMap()->GetVisibilityRange();
@@ -1471,7 +1492,9 @@ float WorldObject::GetSightRange(WorldObject const* target) const
{
if (ToPlayer())
{
- if (target && target->IsFarVisible() && !target->ToPlayer())
+ if (target && target->IsVisibilityOverridden() && !target->ToPlayer())
+ return *target->m_visibilityDistanceOverride;
+ else if (target && target->IsFarVisible() && !target->ToPlayer())
return MAX_VISIBILITY_DISTANCE;
else if (ToPlayer()->GetCinematicMgr()->IsOnCinematic())
return DEFAULT_VISIBILITY_INSTANCE;
diff --git a/src/server/game/Entities/Object/Object.h b/src/server/game/Entities/Object/Object.h
index db707fac897..7b13276a7f8 100644
--- a/src/server/game/Entities/Object/Object.h
+++ b/src/server/game/Entities/Object/Object.h
@@ -28,6 +28,7 @@
#include "MovementInfo.h"
#include "ObjectDefines.h"
#include "ObjectGuid.h"
+#include "Optional.h"
#include "Position.h"
#include "SharedDefines.h"
#include "SpellDefines.h"
@@ -479,6 +480,8 @@ class TC_GAME_API WorldObject : public Object, public WorldLocation
void setActive(bool isActiveObject);
bool IsFarVisible() const { return m_isFarVisible; }
void SetFarVisible(bool on);
+ bool IsVisibilityOverridden() const { return m_visibilityDistanceOverride.is_initialized(); }
+ void SetVisibilityDistanceOverride(VisibilityDistanceType type);
void SetWorldObject(bool apply);
bool IsPermanentWorldObject() const { return m_isWorldObject; }
bool IsWorldObject() const;
@@ -519,6 +522,7 @@ class TC_GAME_API WorldObject : public Object, public WorldLocation
std::string m_name;
bool m_isActive;
bool m_isFarVisible;
+ Optional<float> m_visibilityDistanceOverride;
bool const m_isWorldObject;
ZoneScript* m_zoneScript;
diff --git a/src/server/game/Entities/Object/ObjectDefines.h b/src/server/game/Entities/Object/ObjectDefines.h
index ca6a55913e2..0a4faeb1281 100644
--- a/src/server/game/Entities/Object/ObjectDefines.h
+++ b/src/server/game/Entities/Object/ObjectDefines.h
@@ -21,16 +21,21 @@
#include "Define.h"
-#define CONTACT_DISTANCE 0.5f
-#define INTERACTION_DISTANCE 5.0f
-#define ATTACK_DISTANCE 5.0f
-#define INSPECT_DISTANCE 28.0f
-#define TRADE_DISTANCE 11.11f
-#define MAX_VISIBILITY_DISTANCE SIZE_OF_GRIDS // max distance for visible objects
-#define SIGHT_RANGE_UNIT 50.0f
-#define DEFAULT_VISIBILITY_DISTANCE 90.0f // default visible distance, 90 yards on continents
-#define DEFAULT_VISIBILITY_INSTANCE 170.0f // default visible distance in instances, 170 yards
-#define DEFAULT_VISIBILITY_BGARENAS 533.0f // default visible distance in BG/Arenas, roughly 533 yards
+#define CONTACT_DISTANCE 0.5f
+#define INTERACTION_DISTANCE 5.0f
+#define ATTACK_DISTANCE 5.0f
+#define INSPECT_DISTANCE 28.0f
+#define TRADE_DISTANCE 11.11f
+#define MAX_VISIBILITY_DISTANCE SIZE_OF_GRIDS // max distance for visible objects
+#define SIGHT_RANGE_UNIT 50.0f
+#define VISIBILITY_DISTANCE_GIGANTIC 400.0f
+#define VISIBILITY_DISTANCE_LARGE 200.0f
+#define VISIBILITY_DISTANCE_NORMAL 100.0f
+#define VISIBILITY_DISTANCE_SMALL 50.0f
+#define VISIBILITY_DISTANCE_TINY 25.0f
+#define DEFAULT_VISIBILITY_DISTANCE VISIBILITY_DISTANCE_NORMAL // default visible distance, 100 yards on continents
+#define DEFAULT_VISIBILITY_INSTANCE 170.0f // default visible distance in instances, 170 yards
+#define DEFAULT_VISIBILITY_BGARENAS 533.0f // default visible distance in BG/Arenas, roughly 533 yards
#define DEFAULT_PLAYER_BOUNDING_RADIUS 0.388999998569489f // player size, also currently used (correctly?) for any non Unit world objects
#define DEFAULT_PLAYER_COMBAT_REACH 1.5f
@@ -38,6 +43,18 @@
#define NOMINAL_MELEE_RANGE 5.0f
#define MELEE_RANGE (NOMINAL_MELEE_RANGE - MIN_MELEE_REACH * 2) //center to center for players
+enum class VisibilityDistanceType : uint8
+{
+ Normal = 0,
+ Tiny = 1,
+ Small = 2,
+ Large = 3,
+ Gigantic = 4,
+ Infinite = 5,
+
+ Max
+};
+
enum TempSummonType
{
TEMPSUMMON_TIMED_OR_DEAD_DESPAWN = 1, // despawns after a specified time OR when the creature disappears