diff options
| author | Kittnz <Kittnz@users.noreply.github.com> | 2019-01-16 20:47:25 +0100 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2019-01-16 20:47:25 +0100 |
| commit | d1c3ee957962897a8b323e8ca40302fc5ff8c932 (patch) | |
| tree | 3172d2e387de6b2728ba7eb2700351ba2ad6740d /src/server/game/Entities/Object | |
| parent | 583eba3688c1ab8a4c5de38e00939bc491411960 (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.cpp | 27 | ||||
| -rw-r--r-- | src/server/game/Entities/Object/Object.h | 4 | ||||
| -rw-r--r-- | src/server/game/Entities/Object/ObjectDefines.h | 37 |
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 |
