Core/Objects: increase sight range of all Infinite, Gigantic and Large objects & correct general default visibility distance (#22892)

Note: This does not make the object active.

Some info on range
https://trinitycore.atlassian.net/wiki/spaces/tc/pages/74950924/Lua+Scene+Script+Documentation#LuaSceneScriptDocumentation-ActorAOIRange

#21111 #21681 #22891

Thanks Kinzcool & Kelno
This commit is contained in:
Kittnz
2019-01-16 20:48:01 +01:00
committed by GitHub
parent e0c939b0d4
commit 83e6fde066
11 changed files with 186 additions and 42 deletions

File diff suppressed because one or more lines are too long

View File

@@ -538,7 +538,7 @@ bool CompareValues(ComparisionType type, T val1, T val2)
}
template<typename E>
typename std::underlying_type<E>::type AsUnderlyingType(E enumValue)
constexpr typename std::underlying_type<E>::type AsUnderlyingType(E enumValue)
{
static_assert(std::is_enum<E>::value, "AsUnderlyingType can only be used with enums");
return static_cast<typename std::underlying_type<E>::type>(enumValue);

View File

@@ -2360,6 +2360,10 @@ bool Creature::LoadCreaturesAddon()
SetMovementAnimKitId(cainfo->movementAnimKit);
SetMeleeAnimKitId(cainfo->meleeAnimKit);
// Check if visibility distance different
if (cainfo->visibilityDistanceType != VisibilityDistanceType::Normal)
SetVisibilityDistanceOverride(cainfo->visibilityDistanceType);
//Load Path
if (cainfo->path_id != 0)
m_path_id = cainfo->path_id;

View File

@@ -28,6 +28,7 @@
#include <cmath>
struct ItemTemplate;
enum class VisibilityDistanceType : uint8;
enum CreatureDifficultyFlags
{
@@ -578,6 +579,7 @@ struct CreatureAddon
uint16 movementAnimKit;
uint16 meleeAnimKit;
std::vector<uint32> auras;
VisibilityDistanceType visibilityDistanceType;
};
// Vendors

View File

@@ -400,6 +400,18 @@ bool GameObject::Create(uint32 entry, Map* map, Position const& pos, QuaternionD
}
}
// Check if GameObject is Infinite
if (goInfo->IsInfiniteGameObject())
SetVisibilityDistanceOverride(VisibilityDistanceType::Infinite);
// Check if GameObject is Gigantic
if (goInfo->IsGiganticGameObject())
SetVisibilityDistanceOverride(VisibilityDistanceType::Gigantic);
// Check if GameObject is Large
if (goInfo->IsLargeGameObject())
SetVisibilityDistanceOverride(VisibilityDistanceType::Large);
return true;
}

View File

@@ -850,6 +850,60 @@ struct GameObjectTemplate
default: return 0;
}
}
bool IsInfiniteGameObject() const
{
switch (type)
{
case GAMEOBJECT_TYPE_DOOR: return door.InfiniteAOI != 0;
case GAMEOBJECT_TYPE_FLAGSTAND: return flagStand.InfiniteAOI != 0;
case GAMEOBJECT_TYPE_FLAGDROP: return flagDrop.InfiniteAOI != 0;
case GAMEOBJECT_TYPE_TRAPDOOR: return trapdoor.InfiniteAOI != 0;
case GAMEOBJECT_TYPE_NEW_FLAG: return newflag.InfiniteAOI != 0;
default: return false;
}
}
bool IsGiganticGameObject() const
{
switch (type)
{
case GAMEOBJECT_TYPE_DOOR: return door.GiganticAOI != 0;
case GAMEOBJECT_TYPE_BUTTON: return button.GiganticAOI != 0;
case GAMEOBJECT_TYPE_QUESTGIVER: return questgiver.GiganticAOI != 0;
case GAMEOBJECT_TYPE_CHEST: return chest.GiganticAOI != 0;
case GAMEOBJECT_TYPE_GENERIC: return generic.GiganticAOI != 0;
case GAMEOBJECT_TYPE_TRAP: return trap.GiganticAOI != 0;
case GAMEOBJECT_TYPE_SPELL_FOCUS: return spellFocus.GiganticAOI != 0;
case GAMEOBJECT_TYPE_GOOBER: return goober.GiganticAOI != 0;
case GAMEOBJECT_TYPE_SPELLCASTER: return spellCaster.GiganticAOI != 0;
case GAMEOBJECT_TYPE_FLAGSTAND: return flagStand.GiganticAOI != 0;
case GAMEOBJECT_TYPE_FLAGDROP: return flagDrop.GiganticAOI != 0;
case GAMEOBJECT_TYPE_CONTROL_ZONE: return controlZone.GiganticAOI != 0;
case GAMEOBJECT_TYPE_DUNGEON_DIFFICULTY: return dungeonDifficulty.GiganticAOI != 0;
case GAMEOBJECT_TYPE_TRAPDOOR: return trapdoor.GiganticAOI != 0;
case GAMEOBJECT_TYPE_NEW_FLAG: return newflag.GiganticAOI != 0;
case GAMEOBJECT_TYPE_CAPTURE_POINT: return capturePoint.GiganticAOI != 0;
case GAMEOBJECT_TYPE_GARRISON_SHIPMENT: return garrisonShipment.GiganticAOI != 0;
case GAMEOBJECT_TYPE_UI_LINK: return UILink.GiganticAOI != 0;
case GAMEOBJECT_TYPE_GATHERING_NODE: return gatheringNode.GiganticAOI != 0;
default: return false;
}
}
bool IsLargeGameObject() const
{
switch (type)
{
case GAMEOBJECT_TYPE_CHEST: return chest.LargeAOI != 0;
case GAMEOBJECT_TYPE_GENERIC: return generic.LargeAOI != 0;
case GAMEOBJECT_TYPE_DUNGEON_DIFFICULTY: return dungeonDifficulty.LargeAOI != 0;
case GAMEOBJECT_TYPE_GARRISON_SHIPMENT: return garrisonShipment.LargeAOI != 0;
case GAMEOBJECT_TYPE_ARTIFACT_FORGE: return artifactForge.LargeAOI != 0;
case GAMEOBJECT_TYPE_GATHERING_NODE: return gatheringNode.LargeAOI != 0;
default: return false;
}
}
};
// From `gameobject_template_addon`

View File

@@ -51,6 +51,16 @@
#include "WorldSession.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_objectTypeId = TYPEID_OBJECT;
@@ -1615,6 +1625,15 @@ void WorldObject::setActive(bool 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())
@@ -2061,7 +2080,9 @@ float WorldObject::GetGridActivationRange() const
float WorldObject::GetVisibilityRange() const
{
if (isActiveObject() && !ToPlayer())
if (IsVisibilityOverridden() && !ToPlayer())
return *m_visibilityDistanceOverride;
else if (isActiveObject() && !ToPlayer())
return MAX_VISIBILITY_DISTANCE;
else
return GetMap()->GetVisibilityRange();
@@ -2073,7 +2094,9 @@ float WorldObject::GetSightRange(const WorldObject* target) const
{
if (ToPlayer())
{
if (target && target->isActiveObject() && !target->ToPlayer())
if (target && target->IsVisibilityOverridden() && !target->ToPlayer())
return *target->m_visibilityDistanceOverride;
else if (target && target->isActiveObject() && !target->ToPlayer())
return MAX_VISIBILITY_DISTANCE;
else if (ToPlayer()->GetCinematicMgr()->IsOnCinematic())
return DEFAULT_VISIBILITY_INSTANCE;

View File

@@ -26,6 +26,7 @@
#include "MovementInfo.h"
#include "ObjectDefines.h"
#include "ObjectGuid.h"
#include "Optional.h"
#include "PhaseShift.h"
#include "Position.h"
#include "SharedDefines.h"
@@ -572,6 +573,8 @@ class TC_GAME_API WorldObject : public Object, public WorldLocation
bool isActiveObject() const { return m_isActive; }
void setActive(bool isActiveObject);
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;
@@ -604,6 +607,7 @@ class TC_GAME_API WorldObject : public Object, public WorldLocation
protected:
std::string m_name;
bool m_isActive;
Optional<float> m_visibilityDistanceOverride;
const bool m_isWorldObject;
ZoneScript* m_zoneScript;

View File

@@ -21,22 +21,39 @@
#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_WORLD_OBJECT_SIZE 0.388999998569489f // player size, also currently used (correctly?) for any non Unit world objects
#define DEFAULT_COMBAT_REACH 1.5f
#define MIN_MELEE_REACH 2.0f
#define NOMINAL_MELEE_RANGE 5.0f
#define MELEE_RANGE (NOMINAL_MELEE_RANGE - MIN_MELEE_REACH * 2) //center to center for players
#define DEFAULT_WORLD_OBJECT_SIZE 0.388999998569489f // player size, also currently used (correctly?) for any non Unit world objects
#define DEFAULT_COMBAT_REACH 1.5f
#define MIN_MELEE_REACH 2.0f
#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
{

View File

@@ -588,8 +588,8 @@ void ObjectMgr::LoadCreatureTemplateAddons()
{
uint32 oldMSTime = getMSTime();
// 0 1 2 3 4 5 6 7 8 9
QueryResult result = WorldDatabase.Query("SELECT entry, path_id, mount, bytes1, bytes2, emote, aiAnimKit, movementAnimKit, meleeAnimKit, auras FROM creature_template_addon");
// 0 1 2 3 4 5 6 7 8 9 10
QueryResult result = WorldDatabase.Query("SELECT entry, path_id, mount, bytes1, bytes2, emote, aiAnimKit, movementAnimKit, meleeAnimKit, visibilityDistanceType, auras FROM creature_template_addon");
if (!result)
{
@@ -612,16 +612,17 @@ void ObjectMgr::LoadCreatureTemplateAddons()
CreatureAddon& creatureAddon = _creatureTemplateAddonStore[entry];
creatureAddon.path_id = fields[1].GetUInt32();
creatureAddon.mount = fields[2].GetUInt32();
creatureAddon.bytes1 = fields[3].GetUInt32();
creatureAddon.bytes2 = fields[4].GetUInt32();
creatureAddon.emote = fields[5].GetUInt32();
creatureAddon.aiAnimKit = fields[6].GetUInt16();
creatureAddon.movementAnimKit = fields[7].GetUInt16();
creatureAddon.meleeAnimKit = fields[8].GetUInt16();
creatureAddon.path_id = fields[1].GetUInt32();
creatureAddon.mount = fields[2].GetUInt32();
creatureAddon.bytes1 = fields[3].GetUInt32();
creatureAddon.bytes2 = fields[4].GetUInt32();
creatureAddon.emote = fields[5].GetUInt32();
creatureAddon.aiAnimKit = fields[6].GetUInt16();
creatureAddon.movementAnimKit = fields[7].GetUInt16();
creatureAddon.meleeAnimKit = fields[8].GetUInt16();
creatureAddon.visibilityDistanceType = VisibilityDistanceType(fields[9].GetUInt8());
Tokenizer tokens(fields[9].GetString(), ' ');
Tokenizer tokens(fields[10].GetString(), ' ');
uint8 i = 0;
creatureAddon.auras.resize(tokens.size());
for (Tokenizer::const_iterator itr = tokens.begin(); itr != tokens.end(); ++itr)
@@ -679,6 +680,13 @@ void ObjectMgr::LoadCreatureTemplateAddons()
creatureAddon.meleeAnimKit = 0;
}
if (creatureAddon.visibilityDistanceType >= VisibilityDistanceType::Max)
{
TC_LOG_ERROR("sql.sql", "Creature (Entry: %u) has invalid visibilityDistanceType (%u) defined in `creature_template_addon`.",
entry, AsUnderlyingType(creatureAddon.visibilityDistanceType));
creatureAddon.visibilityDistanceType = VisibilityDistanceType::Normal;
}
++count;
}
while (result->NextRow());
@@ -1064,8 +1072,8 @@ void ObjectMgr::LoadCreatureAddons()
{
uint32 oldMSTime = getMSTime();
// 0 1 2 3 4 5 6 7 8 9
QueryResult result = WorldDatabase.Query("SELECT guid, path_id, mount, bytes1, bytes2, emote, aiAnimKit, movementAnimKit, meleeAnimKit, auras FROM creature_addon");
// 0 1 2 3 4 5 6 7 8 9 10
QueryResult result = WorldDatabase.Query("SELECT guid, path_id, mount, bytes1, bytes2, emote, aiAnimKit, movementAnimKit, meleeAnimKit, visibilityDistanceType, auras FROM creature_addon");
if (!result)
{
@@ -1096,15 +1104,16 @@ void ObjectMgr::LoadCreatureAddons()
TC_LOG_ERROR("sql.sql", "Creature (GUID " UI64FMTD ") has movement type set to WAYPOINT_MOTION_TYPE but no path assigned", guid);
}
creatureAddon.mount = fields[2].GetUInt32();
creatureAddon.bytes1 = fields[3].GetUInt32();
creatureAddon.bytes2 = fields[4].GetUInt32();
creatureAddon.emote = fields[5].GetUInt32();
creatureAddon.aiAnimKit = fields[6].GetUInt16();
creatureAddon.movementAnimKit = fields[7].GetUInt16();
creatureAddon.meleeAnimKit = fields[8].GetUInt16();
creatureAddon.mount = fields[2].GetUInt32();
creatureAddon.bytes1 = fields[3].GetUInt32();
creatureAddon.bytes2 = fields[4].GetUInt32();
creatureAddon.emote = fields[5].GetUInt32();
creatureAddon.aiAnimKit = fields[6].GetUInt16();
creatureAddon.movementAnimKit = fields[7].GetUInt16();
creatureAddon.meleeAnimKit = fields[8].GetUInt16();
creatureAddon.visibilityDistanceType = VisibilityDistanceType(fields[9].GetUInt8());
Tokenizer tokens(fields[9].GetString(), ' ');
Tokenizer tokens(fields[10].GetString(), ' ');
uint8 i = 0;
creatureAddon.auras.resize(tokens.size());
for (Tokenizer::const_iterator itr = tokens.begin(); itr != tokens.end(); ++itr)
@@ -1162,6 +1171,13 @@ void ObjectMgr::LoadCreatureAddons()
creatureAddon.meleeAnimKit = 0;
}
if (creatureAddon.visibilityDistanceType >= VisibilityDistanceType::Max)
{
TC_LOG_ERROR("sql.sql", "Creature (GUID: " UI64FMTD ") has invalid visibilityDistanceType (%u) defined in `creature_addon`.",
guid, AsUnderlyingType(creatureAddon.visibilityDistanceType));
creatureAddon.visibilityDistanceType = VisibilityDistanceType::Normal;
}
++count;
}
while (result->NextRow());

View File

@@ -2022,15 +2022,15 @@ Visibility.GroupMode = 1
# Visibility.Distance.Instances
# Visibility.Distance.BGArenas
# Description: Visibility distance to see other players or gameobjects.
# Visibility on continents on retail ~90 yards. In BG/Arenas ~533.
# Visibility on continents on retail ~100 yards. In BG/Arenas ~533.
# For instances default ~170.
# Max limited by grid size: 533.33333
# Min limit is max aggro radius (45) * Rate.Creature.Aggro
# Default: 90 - (Visibility.Distance.Continents)
# Default: 100 - (Visibility.Distance.Continents)
# 170 - (Visibility.Distance.Instances)
# 533 - (Visibility.Distance.BGArenas)
Visibility.Distance.Continents = 90
Visibility.Distance.Continents = 100
Visibility.Distance.Instances = 170
Visibility.Distance.BGArenas = 533