aboutsummaryrefslogtreecommitdiff
path: root/src/server/game/Maps/Map.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/server/game/Maps/Map.cpp')
-rw-r--r--src/server/game/Maps/Map.cpp26
1 files changed, 25 insertions, 1 deletions
diff --git a/src/server/game/Maps/Map.cpp b/src/server/game/Maps/Map.cpp
index 5e1b17d9d0d..9e553dd19e3 100644
--- a/src/server/game/Maps/Map.cpp
+++ b/src/server/game/Maps/Map.cpp
@@ -564,12 +564,15 @@ void Map::EnsureGridCreated_i(GridCoord const& p)
}
//Load NGrid and make it active
-void Map::EnsureGridLoadedForActiveObject(Cell const& cell, WorldObject* object)
+void Map::EnsureGridLoadedForActiveObject(Cell const& cell, WorldObject const* object)
{
EnsureGridLoaded(cell);
NGridType *grid = getNGrid(cell.GridX(), cell.GridY());
ASSERT(grid != nullptr);
+ if (object->IsPlayer())
+ GetMultiPersonalPhaseTracker().LoadGrid(object->GetPhaseShift(), *grid, this, cell);
+
// refresh grid state & timer
if (grid->GetGridState() != GRID_STATE_ACTIVE)
{
@@ -635,6 +638,11 @@ void Map::LoadGrid(float x, float y)
EnsureGridLoaded(Cell(x, y));
}
+void Map::LoadGridForActiveObject(float x, float y, WorldObject const* object)
+{
+ EnsureGridLoadedForActiveObject(Cell(x, y), object);
+}
+
bool Map::AddPlayerToMap(Player* player, bool initPlayer /*= true*/)
{
CellCoord cellCoord = Trinity::ComputeCellCoord(player->GetPositionX(), player->GetPositionY());
@@ -671,6 +679,12 @@ bool Map::AddPlayerToMap(Player* player, bool initPlayer /*= true*/)
return true;
}
+void Map::UpdatePersonalPhasesForPlayer(Player const* player)
+{
+ Cell cell(player->GetPositionX(), player->GetPositionY());
+ GetMultiPersonalPhaseTracker().OnOwnerPhaseChanged(player, getNGrid(cell.GridX(), cell.GridY()), this, cell);
+}
+
template<class T>
void Map::InitializeObject(T* /*obj*/) { }
@@ -939,6 +953,9 @@ void Map::Update(uint32 t_diff)
_weatherUpdateTimer.Reset();
}
+ // update phase shift objects
+ GetMultiPersonalPhaseTracker().Update(this, t_diff);
+
MoveAllCreaturesInMoveList();
MoveAllGameObjectsInMoveList();
MoveAllAreaTriggersInMoveList();
@@ -1044,6 +1061,8 @@ void Map::RemovePlayerFromMap(Player* player, bool remove)
player->UpdateZone(MAP_INVALID_ZONE, 0);
sScriptMgr->OnPlayerLeaveMap(this, player);
+ GetMultiPersonalPhaseTracker().MarkAllPhasesForDeletion(player->GetGUID());
+
player->CombatStop();
bool const inWorld = player->IsInWorld();
@@ -1070,6 +1089,8 @@ void Map::RemoveFromMap(T *obj, bool remove)
if (obj->isActiveObject())
RemoveFromActive(obj);
+ GetMultiPersonalPhaseTracker().UnregisterTrackedObject(obj);
+
if (!inWorld) // if was in world, RemoveFromWorld() called DestroyForNearbyPlayers()
obj->DestroyForNearbyPlayers(); // previous obj->UpdateObjectVisibility(true)
@@ -1735,6 +1756,9 @@ bool Map::UnloadGrid(NGridType& ngrid, bool unloadAll)
RemoveAllObjectsInRemoveList();
+ // After removing all objects from the map, purge empty tracked phases
+ GetMultiPersonalPhaseTracker().UnloadGrid(ngrid);
+
{
ObjectGridUnloader worker;
TypeContainerVisitor<ObjectGridUnloader, GridTypeMapContainer> visitor(worker);