fix(Core): increase visibility distance of large game objects (#1788)

This commit is contained in:
Stoabrogga
2019-05-08 08:01:40 +02:00
committed by GitHub
parent a68c13488e
commit eee8e965e7
4 changed files with 48 additions and 3 deletions

View File

@@ -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;
}

View File

@@ -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;

View File

@@ -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();
}

View File

@@ -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;