aboutsummaryrefslogtreecommitdiff
path: root/src/server/game/Maps
diff options
context:
space:
mode:
authorMatan Shukry <matanshukry@gmail.com>2021-12-28 14:24:10 +0200
committerGitHub <noreply@github.com>2021-12-28 13:24:10 +0100
commit8fabe5a3aacf7797f03d074ab8434f445be64955 (patch)
treedd3c977290be47d5a708947893c3544678045194 /src/server/game/Maps
parent1aad7f8ddd486e60f76730d3baa36ec63711c7e8 (diff)
Core/Phasing: Implemented db spawns in personal phases (#26345)
Co-authored-by: Shauren <shauren.trinity@gmail.com>
Diffstat (limited to 'src/server/game/Maps')
-rw-r--r--src/server/game/Maps/Map.cpp26
-rw-r--r--src/server/game/Maps/Map.h14
-rw-r--r--src/server/game/Maps/MapObject.h2
3 files changed, 39 insertions, 3 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);
diff --git a/src/server/game/Maps/Map.h b/src/server/game/Maps/Map.h
index e8a1a4d8a00..e5319376181 100644
--- a/src/server/game/Maps/Map.h
+++ b/src/server/game/Maps/Map.h
@@ -30,6 +30,7 @@
#include "MPSCQueue.h"
#include "ObjectGuid.h"
#include "Optional.h"
+#include "PersonalPhaseTracker.h"
#include "SharedDefines.h"
#include "SpawnData.h"
#include "Timer.h"
@@ -313,6 +314,7 @@ class TC_GAME_API Map : public GridRefManager<NGridType>
bool GetUnloadLock(GridCoord const& p) const { return getNGrid(p.x_coord, p.y_coord)->getUnloadLock(); }
void SetUnloadLock(GridCoord const& p, bool on) { getNGrid(p.x_coord, p.y_coord)->setUnloadExplicitLock(on); }
void LoadGrid(float x, float y);
+ void LoadGridForActiveObject(float x, float y, WorldObject const* object);
void LoadAllCells();
bool UnloadGrid(NGridType& ngrid, bool pForce);
void GridMarkNoUnload(uint32 x, uint32 y);
@@ -656,7 +658,7 @@ class TC_GAME_API Map : public GridRefManager<NGridType>
void EnsureGridCreated(GridCoord const&);
void EnsureGridCreated_i(GridCoord const&);
bool EnsureGridLoaded(Cell const&);
- void EnsureGridLoadedForActiveObject(Cell const&, WorldObject* object);
+ void EnsureGridLoadedForActiveObject(Cell const&, WorldObject const* object);
void buildNGridLinkage(NGridType* pNGridType) { pNGridType->link(this); }
@@ -881,6 +883,16 @@ class TC_GAME_API Map : public GridRefManager<NGridType>
std::unordered_set<Object*> _updateObjects;
MPSCQueue<FarSpellCallback> _farSpellCallbacks;
+
+ /*********************************************************/
+ /*** Phasing ***/
+ /*********************************************************/
+ public:
+ MultiPersonalPhaseTracker& GetMultiPersonalPhaseTracker() { return _multiPersonalPhaseTracker; }
+ void UpdatePersonalPhasesForPlayer(Player const* player);
+
+ private:
+ MultiPersonalPhaseTracker _multiPersonalPhaseTracker;
};
enum InstanceResetMethod
diff --git a/src/server/game/Maps/MapObject.h b/src/server/game/Maps/MapObject.h
index 94b88155f5c..6481fc87cc0 100644
--- a/src/server/game/Maps/MapObject.h
+++ b/src/server/game/Maps/MapObject.h
@@ -35,7 +35,7 @@ enum MapObjectCellMoveState
class TC_GAME_API MapObject
{
friend class Map; //map for moving creatures
- friend class ObjectGridLoader; //grid loader for loading creatures
+ friend class ObjectGridLoaderBase; //grid loader for loading creatures
protected:
MapObject() : _moveState(MAP_OBJECT_CELL_MOVE_NONE)