feat(Core/Maps): Remove active objects nearby cell marking handling (#22585)
This commit is contained in:
@@ -1083,31 +1083,14 @@ void WorldObject::setActive(bool on)
|
|||||||
|
|
||||||
m_isActive = on;
|
m_isActive = on;
|
||||||
|
|
||||||
if (on && !IsInWorld())
|
if (!on || !IsInWorld())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
Map* map = FindMap();
|
Map* map = FindMap();
|
||||||
if (!map)
|
if (!map)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (on)
|
map->AddObjectToPendingUpdateList(this);
|
||||||
{
|
|
||||||
if (IsCreature())
|
|
||||||
map->AddToActive(this->ToCreature());
|
|
||||||
else if (IsDynamicObject())
|
|
||||||
map->AddToActive((DynamicObject*)this);
|
|
||||||
else if (IsGameObject())
|
|
||||||
map->AddToActive((GameObject*)this);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if (IsCreature())
|
|
||||||
map->RemoveFromActive(this->ToCreature());
|
|
||||||
else if (IsDynamicObject())
|
|
||||||
map->RemoveFromActive((DynamicObject*)this);
|
|
||||||
else if (IsGameObject())
|
|
||||||
map->RemoveFromActive((GameObject*)this);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void WorldObject::SetVisibilityDistanceOverride(VisibilityDistanceType type)
|
void WorldObject::SetVisibilityDistanceOverride(VisibilityDistanceType type)
|
||||||
|
|||||||
@@ -32,8 +32,6 @@ void GridObjectLoader::AddObjectHelper(Map* map, T* obj)
|
|||||||
|
|
||||||
map->AddToGrid(obj, cell);
|
map->AddToGrid(obj, cell);
|
||||||
obj->AddToWorld();
|
obj->AddToWorld();
|
||||||
if (obj->isActiveObject())
|
|
||||||
map->AddToActive(obj);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void GridObjectLoader::LoadCreatures(CellGuidSet const& guid_set, Map* map)
|
void GridObjectLoader::LoadCreatures(CellGuidSet const& guid_set, Map* map)
|
||||||
|
|||||||
@@ -73,8 +73,7 @@ Map::~Map()
|
|||||||
|
|
||||||
Map::Map(uint32 id, uint32 InstanceId, uint8 SpawnMode, Map* _parent) :
|
Map::Map(uint32 id, uint32 InstanceId, uint8 SpawnMode, Map* _parent) :
|
||||||
_mapGridManager(this), i_mapEntry(sMapStore.LookupEntry(id)), i_spawnMode(SpawnMode), i_InstanceId(InstanceId),
|
_mapGridManager(this), i_mapEntry(sMapStore.LookupEntry(id)), i_spawnMode(SpawnMode), i_InstanceId(InstanceId),
|
||||||
m_unloadTimer(0), m_VisibleDistance(DEFAULT_VISIBILITY_DISTANCE),
|
m_unloadTimer(0), m_VisibleDistance(DEFAULT_VISIBILITY_DISTANCE), _instanceResetPeriod(0),
|
||||||
_instanceResetPeriod(0), m_activeNonPlayersIter(m_activeNonPlayers.end()),
|
|
||||||
_transportsUpdateIter(_transports.end()), i_scriptLock(false), _defaultLight(GetDefaultMapLight(id))
|
_transportsUpdateIter(_transports.end()), i_scriptLock(false), _defaultLight(GetDefaultMapLight(id))
|
||||||
{
|
{
|
||||||
m_parentMap = (_parent ? _parent : this);
|
m_parentMap = (_parent ? _parent : this);
|
||||||
@@ -357,9 +356,6 @@ bool Map::AddToMap(T* obj, bool checkTransport)
|
|||||||
|
|
||||||
InitializeObject(obj);
|
InitializeObject(obj);
|
||||||
|
|
||||||
if (obj->isActiveObject())
|
|
||||||
AddToActive(obj);
|
|
||||||
|
|
||||||
//something, such as vehicle, needs to be update immediately
|
//something, such as vehicle, needs to be update immediately
|
||||||
//also, trigger needs to cast spell, if not update, cannot see visual
|
//also, trigger needs to cast spell, if not update, cannot see visual
|
||||||
obj->UpdateObjectVisibility(true);
|
obj->UpdateObjectVisibility(true);
|
||||||
@@ -393,9 +389,6 @@ bool Map::AddToMap(MotionTransport* obj, bool /*checkTransport*/)
|
|||||||
|
|
||||||
obj->AddToWorld();
|
obj->AddToWorld();
|
||||||
|
|
||||||
if (obj->isActiveObject())
|
|
||||||
AddToActive(obj);
|
|
||||||
|
|
||||||
_transports.insert(obj);
|
_transports.insert(obj);
|
||||||
|
|
||||||
// Broadcast creation to players
|
// Broadcast creation to players
|
||||||
@@ -511,19 +504,6 @@ void Map::Update(const uint32 t_diff, const uint32 s_diff, bool /*thread*/)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (_updatableObjectListRecheckTimer.Passed())
|
|
||||||
{
|
|
||||||
// Mark all cells near active objects
|
|
||||||
for (m_activeNonPlayersIter = m_activeNonPlayers.begin(); m_activeNonPlayersIter != m_activeNonPlayers.end(); ++m_activeNonPlayersIter)
|
|
||||||
{
|
|
||||||
WorldObject* obj = *m_activeNonPlayersIter;
|
|
||||||
if (!obj || !obj->IsInWorld())
|
|
||||||
continue;
|
|
||||||
|
|
||||||
MarkNearbyCellsOf(obj);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
UpdateNonPlayerObjects(t_diff);
|
UpdateNonPlayerObjects(t_diff);
|
||||||
|
|
||||||
SendObjectUpdates();
|
SendObjectUpdates();
|
||||||
@@ -699,9 +679,6 @@ void Map::RemoveFromMap(T* obj, bool remove)
|
|||||||
{
|
{
|
||||||
obj->RemoveFromWorld();
|
obj->RemoveFromWorld();
|
||||||
|
|
||||||
if (obj->isActiveObject())
|
|
||||||
RemoveFromActive(obj);
|
|
||||||
|
|
||||||
obj->RemoveFromGrid();
|
obj->RemoveFromGrid();
|
||||||
|
|
||||||
obj->ResetMap();
|
obj->ResetMap();
|
||||||
@@ -717,8 +694,6 @@ template<>
|
|||||||
void Map::RemoveFromMap(MotionTransport* obj, bool remove)
|
void Map::RemoveFromMap(MotionTransport* obj, bool remove)
|
||||||
{
|
{
|
||||||
obj->RemoveFromWorld();
|
obj->RemoveFromWorld();
|
||||||
if (obj->isActiveObject())
|
|
||||||
RemoveFromActive(obj);
|
|
||||||
|
|
||||||
Map::PlayerList const& players = GetPlayers();
|
Map::PlayerList const& players = GetPlayers();
|
||||||
if (!players.IsEmpty())
|
if (!players.IsEmpty())
|
||||||
@@ -1820,60 +1795,6 @@ void Map::SendToPlayers(WorldPacket const* data) const
|
|||||||
itr->GetSource()->GetSession()->SendPacket(data);
|
itr->GetSource()->GetSession()->SendPacket(data);
|
||||||
}
|
}
|
||||||
|
|
||||||
template<class T>
|
|
||||||
void Map::AddToActive(T* obj)
|
|
||||||
{
|
|
||||||
AddToActiveHelper(obj);
|
|
||||||
}
|
|
||||||
|
|
||||||
template <>
|
|
||||||
void Map::AddToActive(Creature* c)
|
|
||||||
{
|
|
||||||
AddToActiveHelper(c);
|
|
||||||
}
|
|
||||||
|
|
||||||
template<>
|
|
||||||
void Map::AddToActive(DynamicObject* d)
|
|
||||||
{
|
|
||||||
AddToActiveHelper(d);
|
|
||||||
}
|
|
||||||
|
|
||||||
template<>
|
|
||||||
void Map::AddToActive(GameObject* d)
|
|
||||||
{
|
|
||||||
AddToActiveHelper(d);
|
|
||||||
}
|
|
||||||
|
|
||||||
template<>
|
|
||||||
void Map::AddToActive(Corpse* /*c*/)
|
|
||||||
{
|
|
||||||
// do nothing for corpses
|
|
||||||
}
|
|
||||||
|
|
||||||
template<class T>
|
|
||||||
void Map::RemoveFromActive(T* obj)
|
|
||||||
{
|
|
||||||
RemoveFromActiveHelper(obj);
|
|
||||||
}
|
|
||||||
|
|
||||||
template <>
|
|
||||||
void Map::RemoveFromActive(Creature* c)
|
|
||||||
{
|
|
||||||
RemoveFromActiveHelper(c);
|
|
||||||
}
|
|
||||||
|
|
||||||
template<>
|
|
||||||
void Map::RemoveFromActive(DynamicObject* obj)
|
|
||||||
{
|
|
||||||
RemoveFromActiveHelper(obj);
|
|
||||||
}
|
|
||||||
|
|
||||||
template<>
|
|
||||||
void Map::RemoveFromActive(GameObject* obj)
|
|
||||||
{
|
|
||||||
RemoveFromActiveHelper(obj);
|
|
||||||
}
|
|
||||||
|
|
||||||
template bool Map::AddToMap(Corpse*, bool);
|
template bool Map::AddToMap(Corpse*, bool);
|
||||||
template bool Map::AddToMap(Creature*, bool);
|
template bool Map::AddToMap(Creature*, bool);
|
||||||
template bool Map::AddToMap(GameObject*, bool);
|
template bool Map::AddToMap(GameObject*, bool);
|
||||||
|
|||||||
@@ -327,14 +327,6 @@ public:
|
|||||||
void ScriptsStart(std::map<uint32, std::multimap<uint32, ScriptInfo> > const& scripts, uint32 id, Object* source, Object* target);
|
void ScriptsStart(std::map<uint32, std::multimap<uint32, ScriptInfo> > const& scripts, uint32 id, Object* source, Object* target);
|
||||||
void ScriptCommandStart(ScriptInfo const& script, uint32 delay, Object* source, Object* target);
|
void ScriptCommandStart(ScriptInfo const& script, uint32 delay, Object* source, Object* target);
|
||||||
|
|
||||||
// must called with AddToWorld
|
|
||||||
template<class T>
|
|
||||||
void AddToActive(T* obj);
|
|
||||||
|
|
||||||
// must called with RemoveFromWorld
|
|
||||||
template<class T>
|
|
||||||
void RemoveFromActive(T* obj);
|
|
||||||
|
|
||||||
CreatureGroupHolderType CreatureGroupHolder;
|
CreatureGroupHolderType CreatureGroupHolder;
|
||||||
|
|
||||||
void UpdateIteratorBack(Player* player);
|
void UpdateIteratorBack(Player* player);
|
||||||
@@ -490,10 +482,7 @@ public:
|
|||||||
_updateObjects.erase(obj);
|
_updateObjects.erase(obj);
|
||||||
}
|
}
|
||||||
|
|
||||||
std::size_t GetActiveNonPlayersCount() const
|
size_t GetUpdateObjectsCount() const { return _updateObjects.size(); }
|
||||||
{
|
|
||||||
return m_activeNonPlayers.size();
|
|
||||||
}
|
|
||||||
|
|
||||||
virtual std::string GetDebugInfo() const;
|
virtual std::string GetDebugInfo() const;
|
||||||
|
|
||||||
@@ -549,10 +538,6 @@ protected:
|
|||||||
MapRefMgr m_mapRefMgr;
|
MapRefMgr m_mapRefMgr;
|
||||||
MapRefMgr::iterator m_mapRefIter;
|
MapRefMgr::iterator m_mapRefIter;
|
||||||
|
|
||||||
typedef std::set<WorldObject*> ActiveNonPlayers;
|
|
||||||
ActiveNonPlayers m_activeNonPlayers;
|
|
||||||
ActiveNonPlayers::iterator m_activeNonPlayersIter;
|
|
||||||
|
|
||||||
// Objects that must update even in inactive grids without activating them
|
// Objects that must update even in inactive grids without activating them
|
||||||
TransportsContainer _transports;
|
TransportsContainer _transports;
|
||||||
TransportsContainer::iterator _transportsUpdateIter;
|
TransportsContainer::iterator _transportsUpdateIter;
|
||||||
@@ -583,27 +568,6 @@ private:
|
|||||||
template<class T>
|
template<class T>
|
||||||
void DeleteFromWorld(T*);
|
void DeleteFromWorld(T*);
|
||||||
|
|
||||||
void AddToActiveHelper(WorldObject* obj)
|
|
||||||
{
|
|
||||||
m_activeNonPlayers.insert(obj);
|
|
||||||
}
|
|
||||||
|
|
||||||
void RemoveFromActiveHelper(WorldObject* obj)
|
|
||||||
{
|
|
||||||
// Map::Update for active object in proccess
|
|
||||||
if (m_activeNonPlayersIter != m_activeNonPlayers.end())
|
|
||||||
{
|
|
||||||
ActiveNonPlayers::iterator itr = m_activeNonPlayers.find(obj);
|
|
||||||
if (itr == m_activeNonPlayers.end())
|
|
||||||
return;
|
|
||||||
if (itr == m_activeNonPlayersIter)
|
|
||||||
++m_activeNonPlayersIter;
|
|
||||||
m_activeNonPlayers.erase(itr);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
m_activeNonPlayers.erase(obj);
|
|
||||||
}
|
|
||||||
|
|
||||||
void UpdateNonPlayerObjects(uint32 const diff);
|
void UpdateNonPlayerObjects(uint32 const diff);
|
||||||
|
|
||||||
void _AddObjectToUpdateList(WorldObject* obj);
|
void _AddObjectToUpdateList(WorldObject* obj);
|
||||||
|
|||||||
@@ -1347,11 +1347,11 @@ public:
|
|||||||
|
|
||||||
static void HandleDebugObjectCountMap(ChatHandler* handler, Map* map)
|
static void HandleDebugObjectCountMap(ChatHandler* handler, Map* map)
|
||||||
{
|
{
|
||||||
handler->PSendSysMessage("Map Id: {} Name: '{}' Instance Id: {} Creatures: {} GameObjects: {} SetActive Objects: {}",
|
handler->PSendSysMessage("Map Id: {} Name: '{}' Instance Id: {} Creatures: {} GameObjects: {} Update Objects: {}",
|
||||||
map->GetId(), map->GetMapName(), map->GetInstanceId(),
|
map->GetId(), map->GetMapName(), map->GetInstanceId(),
|
||||||
uint64(map->GetObjectsStore().Size<Creature>()),
|
uint64(map->GetObjectsStore().Size<Creature>()),
|
||||||
uint64(map->GetObjectsStore().Size<GameObject>()),
|
uint64(map->GetObjectsStore().Size<GameObject>()),
|
||||||
uint64(map->GetActiveNonPlayersCount()));
|
uint64(map->GetUpdateObjectsCount()));
|
||||||
|
|
||||||
CreatureCountWorker worker;
|
CreatureCountWorker worker;
|
||||||
TypeContainerVisitor<CreatureCountWorker, MapStoredObjectTypesContainer> visitor(worker);
|
TypeContainerVisitor<CreatureCountWorker, MapStoredObjectTypesContainer> visitor(worker);
|
||||||
|
|||||||
Reference in New Issue
Block a user