mirror of
https://github.com/TrinityCore/TrinityCore.git
synced 2026-01-16 07:30:42 +01:00
Core/Objects: Remove restriction on what object types can be set as active
This commit is contained in:
@@ -82,32 +82,14 @@ class ObjectWorldLoader
|
||||
uint32& i_corpses;
|
||||
};
|
||||
|
||||
template<class T>
|
||||
void ObjectGridLoaderBase::SetObjectCell(T* /*obj*/, CellCoord const& /*cellCoord*/) { }
|
||||
|
||||
template<> void ObjectGridLoaderBase::SetObjectCell(Creature* obj, CellCoord const& cellCoord)
|
||||
{
|
||||
Cell cell(cellCoord);
|
||||
obj->SetCurrentCell(cell);
|
||||
}
|
||||
|
||||
template<> void ObjectGridLoaderBase::SetObjectCell(GameObject* obj, CellCoord const& cellCoord)
|
||||
void ObjectGridLoaderBase::SetObjectCell(MapObject* obj, CellCoord const& cellCoord)
|
||||
{
|
||||
Cell cell(cellCoord);
|
||||
obj->SetCurrentCell(cell);
|
||||
}
|
||||
|
||||
template <class T>
|
||||
void AddObjectHelper(CellCoord &cell, GridRefManager<T> &m, uint32 &count, Map* /*map*/, T *obj)
|
||||
{
|
||||
obj->AddToGrid(m);
|
||||
ObjectGridLoader::SetObjectCell(obj, cell);
|
||||
obj->AddToWorld();
|
||||
++count;
|
||||
}
|
||||
|
||||
template <>
|
||||
void AddObjectHelper(CellCoord &cell, CreatureMapType &m, uint32 &count, Map* map, Creature *obj)
|
||||
void AddObjectHelper(CellCoord &cell, GridRefManager<T> &m, uint32 &count, Map* map, T *obj)
|
||||
{
|
||||
obj->AddToGrid(m);
|
||||
ObjectGridLoader::SetObjectCell(obj, cell);
|
||||
|
||||
@@ -22,6 +22,7 @@
|
||||
#include "GridDefines.h"
|
||||
#include "Cell.h"
|
||||
|
||||
class MapObject;
|
||||
class ObjectGuid;
|
||||
class ObjectWorldLoader;
|
||||
|
||||
@@ -32,8 +33,7 @@ class TC_GAME_API ObjectGridLoaderBase
|
||||
: i_cell(cell), i_grid(grid), i_map(map), i_gameObjects(0), i_creatures(0), i_corpses(0), i_areaTriggers(0)
|
||||
{ }
|
||||
|
||||
template<class T>
|
||||
static void SetObjectCell(T* obj, CellCoord const& cellCoord);
|
||||
static void SetObjectCell(MapObject* obj, CellCoord const& cellCoord);
|
||||
|
||||
uint32 GetLoadedCreatures() const { return i_creatures; }
|
||||
uint32 GetLoadedGameObjects() const { return i_gameObjects; }
|
||||
|
||||
@@ -3837,71 +3837,84 @@ bool Map::ActiveObjectsNearGrid(NGridType const& ngrid) const
|
||||
return false;
|
||||
}
|
||||
|
||||
template<class T>
|
||||
void Map::AddToActive(T* obj)
|
||||
void Map::AddToActive(WorldObject* obj)
|
||||
{
|
||||
AddToActiveHelper(obj);
|
||||
}
|
||||
|
||||
template <>
|
||||
void Map::AddToActive(Creature* c)
|
||||
{
|
||||
AddToActiveHelper(c);
|
||||
|
||||
// also not allow unloading spawn grid to prevent creating creature clone at load
|
||||
if (!c->IsPet() && c->GetSpawnId())
|
||||
Optional<Position> respawnLocation;
|
||||
switch (obj->GetTypeId())
|
||||
{
|
||||
float x, y, z;
|
||||
c->GetRespawnPosition(x, y, z);
|
||||
GridCoord p = Trinity::ComputeGridCoord(x, y);
|
||||
case TYPEID_UNIT:
|
||||
if (Creature* creature = obj->ToCreature(); !creature->IsPet() && creature->GetSpawnId())
|
||||
{
|
||||
respawnLocation.emplace();
|
||||
creature->GetRespawnPosition(respawnLocation->m_positionX, respawnLocation->m_positionY, respawnLocation->m_positionZ);
|
||||
}
|
||||
break;
|
||||
case TYPEID_GAMEOBJECT:
|
||||
if (GameObject* gameObject = obj->ToGameObject(); gameObject->GetSpawnId())
|
||||
{
|
||||
respawnLocation.emplace();
|
||||
gameObject->GetRespawnPosition(respawnLocation->m_positionX, respawnLocation->m_positionY, respawnLocation->m_positionZ);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
if (respawnLocation)
|
||||
{
|
||||
GridCoord p = Trinity::ComputeGridCoord(respawnLocation->GetPositionX(), respawnLocation->GetPositionY());
|
||||
if (getNGrid(p.x_coord, p.y_coord))
|
||||
getNGrid(p.x_coord, p.y_coord)->incUnloadActiveLock();
|
||||
else
|
||||
{
|
||||
GridCoord p2 = Trinity::ComputeGridCoord(c->GetPositionX(), c->GetPositionY());
|
||||
TC_LOG_ERROR("maps", "Active creature%s added to grid[%u, %u] but spawn grid[%u, %u] was not loaded.",
|
||||
c->GetGUID().ToString().c_str(), p.x_coord, p.y_coord, p2.x_coord, p2.y_coord);
|
||||
GridCoord p2 = Trinity::ComputeGridCoord(obj->GetPositionX(), obj->GetPositionY());
|
||||
TC_LOG_ERROR("maps", "Active object %s added to grid[%u, %u] but spawn grid[%u, %u] was not loaded.",
|
||||
obj->GetGUID().ToString().c_str(), p.x_coord, p.y_coord, p2.x_coord, p2.y_coord);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
template<>
|
||||
void Map::AddToActive(DynamicObject* d)
|
||||
void Map::RemoveFromActive(WorldObject* obj)
|
||||
{
|
||||
AddToActiveHelper(d);
|
||||
}
|
||||
RemoveFromActiveHelper(obj);
|
||||
|
||||
template<class T>
|
||||
void Map::RemoveFromActive(T* /*obj*/) { }
|
||||
|
||||
template <>
|
||||
void Map::RemoveFromActive(Creature* c)
|
||||
{
|
||||
RemoveFromActiveHelper(c);
|
||||
|
||||
// also allow unloading spawn grid
|
||||
if (!c->IsPet() && c->GetSpawnId())
|
||||
Optional<Position> respawnLocation;
|
||||
switch (obj->GetTypeId())
|
||||
{
|
||||
float x, y, z;
|
||||
c->GetRespawnPosition(x, y, z);
|
||||
GridCoord p = Trinity::ComputeGridCoord(x, y);
|
||||
case TYPEID_UNIT:
|
||||
if (Creature* creature = obj->ToCreature(); !creature->IsPet() && creature->GetSpawnId())
|
||||
{
|
||||
respawnLocation.emplace();
|
||||
creature->GetRespawnPosition(respawnLocation->m_positionX, respawnLocation->m_positionY, respawnLocation->m_positionZ);
|
||||
}
|
||||
break;
|
||||
case TYPEID_GAMEOBJECT:
|
||||
if (GameObject* gameObject = obj->ToGameObject(); gameObject->GetSpawnId())
|
||||
{
|
||||
respawnLocation.emplace();
|
||||
gameObject->GetRespawnPosition(respawnLocation->m_positionX, respawnLocation->m_positionY, respawnLocation->m_positionZ);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
if (respawnLocation)
|
||||
{
|
||||
GridCoord p = Trinity::ComputeGridCoord(respawnLocation->GetPositionX(), respawnLocation->GetPositionY());
|
||||
if (getNGrid(p.x_coord, p.y_coord))
|
||||
getNGrid(p.x_coord, p.y_coord)->decUnloadActiveLock();
|
||||
else
|
||||
{
|
||||
GridCoord p2 = Trinity::ComputeGridCoord(c->GetPositionX(), c->GetPositionY());
|
||||
TC_LOG_ERROR("maps", "Active creature %s removed from grid[%u, %u] but spawn grid[%u, %u] was not loaded.",
|
||||
c->GetGUID().ToString().c_str(), p.x_coord, p.y_coord, p2.x_coord, p2.y_coord);
|
||||
GridCoord p2 = Trinity::ComputeGridCoord(obj->GetPositionX(), obj->GetPositionY());
|
||||
TC_LOG_ERROR("maps", "Active object %s removed from to grid[%u, %u] but spawn grid[%u, %u] was not loaded.",
|
||||
obj->GetGUID().ToString().c_str(), p.x_coord, p.y_coord, p2.x_coord, p2.y_coord);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
template<>
|
||||
void Map::RemoveFromActive(DynamicObject* obj)
|
||||
{
|
||||
RemoveFromActiveHelper(obj);
|
||||
}
|
||||
|
||||
template TC_GAME_API bool Map::AddToMap(Corpse*);
|
||||
template TC_GAME_API bool Map::AddToMap(Creature*);
|
||||
template TC_GAME_API bool Map::AddToMap(GameObject*);
|
||||
|
||||
@@ -448,12 +448,10 @@ class TC_GAME_API Map : public GridRefManager<NGridType>
|
||||
void ScriptCommandStart(ScriptInfo const& script, uint32 delay, Object* source, Object* target);
|
||||
|
||||
// must called with AddToWorld
|
||||
template<class T>
|
||||
void AddToActive(T* obj);
|
||||
void AddToActive(WorldObject* obj);
|
||||
|
||||
// must called with RemoveFromWorld
|
||||
template<class T>
|
||||
void RemoveFromActive(T* obj);
|
||||
void RemoveFromActive(WorldObject* obj);
|
||||
|
||||
template<class T> void SwitchGridContainers(T* obj, bool on);
|
||||
std::unordered_map<ObjectGuid::LowType /*leaderSpawnId*/, CreatureGroup*> CreatureGroupHolder;
|
||||
|
||||
Reference in New Issue
Block a user