fix(Core): increase visibility distance of large game objects (#1788)
This commit is contained in:
@@ -351,6 +351,10 @@ bool GameObject::Create(uint32 guidlow, uint32 name_id, Map* map, uint32 phaseMa
|
|||||||
LastUsedScriptID = GetGOInfo()->ScriptId;
|
LastUsedScriptID = GetGOInfo()->ScriptId;
|
||||||
AIM_Initialize();
|
AIM_Initialize();
|
||||||
|
|
||||||
|
// Check if GameObject is Large
|
||||||
|
if (goinfo->IsLargeGameObject())
|
||||||
|
SetVisibilityDistanceOverride(true);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
bool IsGameObjectForQuests() const
|
||||||
{
|
{
|
||||||
return IsForQuests;
|
return IsForQuests;
|
||||||
|
|||||||
@@ -968,7 +968,7 @@ WorldObject::WorldObject(bool isWorldObject) : WorldLocation(),
|
|||||||
#ifdef ELUNA
|
#ifdef ELUNA
|
||||||
elunaEvents(NULL),
|
elunaEvents(NULL),
|
||||||
#endif
|
#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_transport(NULL), m_currMap(NULL), m_InstanceId(0),
|
||||||
m_phaseMask(PHASEMASK_NORMAL), m_notifyflags(0), m_executed_notifies(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*/)
|
void WorldObject::CleanupsBeforeDelete(bool /*finalCleanup*/)
|
||||||
{
|
{
|
||||||
if (IsInWorld())
|
if (IsInWorld())
|
||||||
@@ -1515,7 +1523,14 @@ float WorldObject::GetVisibilityRange() const
|
|||||||
if (isActiveObject() && !ToPlayer())
|
if (isActiveObject() && !ToPlayer())
|
||||||
return MAX_VISIBILITY_DISTANCE;
|
return MAX_VISIBILITY_DISTANCE;
|
||||||
else if (GetTypeId() == TYPEID_GAMEOBJECT)
|
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
|
else
|
||||||
return IsInWintergrasp() ? VISIBILITY_DIST_WINTERGRASP : GetMap()->GetVisibilityRange();
|
return IsInWintergrasp() ? VISIBILITY_DIST_WINTERGRASP : GetMap()->GetVisibilityRange();
|
||||||
}
|
}
|
||||||
@@ -1531,7 +1546,14 @@ float WorldObject::GetSightRange(const WorldObject* target) const
|
|||||||
if (target->isActiveObject() && !target->ToPlayer())
|
if (target->isActiveObject() && !target->ToPlayer())
|
||||||
return MAX_VISIBILITY_DISTANCE;
|
return MAX_VISIBILITY_DISTANCE;
|
||||||
else if (target->GetTypeId() == TYPEID_GAMEOBJECT)
|
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();
|
return IsInWintergrasp() && target->IsInWintergrasp() ? VISIBILITY_DIST_WINTERGRASP : GetMap()->GetVisibilityRange();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -974,6 +974,8 @@ class WorldObject : public Object, public WorldLocation
|
|||||||
|
|
||||||
bool isActiveObject() const { return m_isActive; }
|
bool isActiveObject() const { return m_isActive; }
|
||||||
void setActive(bool isActiveObject);
|
void setActive(bool isActiveObject);
|
||||||
|
bool IsVisibilityOverridden() const { return m_isVisibilityDistanceOverride; }
|
||||||
|
void SetVisibilityDistanceOverride(bool isVisibilityDistanceOverride);
|
||||||
void SetWorldObject(bool apply);
|
void SetWorldObject(bool apply);
|
||||||
bool IsPermanentWorldObject() const { return m_isWorldObject; }
|
bool IsPermanentWorldObject() const { return m_isWorldObject; }
|
||||||
bool IsWorldObject() const;
|
bool IsWorldObject() const;
|
||||||
@@ -1018,6 +1020,7 @@ class WorldObject : public Object, public WorldLocation
|
|||||||
protected:
|
protected:
|
||||||
std::string m_name;
|
std::string m_name;
|
||||||
bool m_isActive;
|
bool m_isActive;
|
||||||
|
bool m_isVisibilityDistanceOverride;
|
||||||
const bool m_isWorldObject;
|
const bool m_isWorldObject;
|
||||||
ZoneScript* m_zoneScript;
|
ZoneScript* m_zoneScript;
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user