aboutsummaryrefslogtreecommitdiff
path: root/src/server
diff options
context:
space:
mode:
authorShauren <shauren.trinity@gmail.com>2023-08-08 00:08:10 +0200
committerShauren <shauren.trinity@gmail.com>2023-08-08 00:08:10 +0200
commit86725ed9267803506d8a5cab04c2c5641a234dd9 (patch)
treec54196bde8686914d3396059a3ea4de34b6ed346 /src/server
parentc489e2620759819b79a728ffaf62bc144b8e0438 (diff)
Core/MMaps: Fixed pathing for objects that have terrain swaps active
Diffstat (limited to 'src/server')
-rw-r--r--src/server/game/Maps/Map.cpp6
-rw-r--r--src/server/game/Maps/TerrainMgr.cpp26
-rw-r--r--src/server/game/Maps/TerrainMgr.h4
-rw-r--r--src/server/game/Movement/PathGenerator.cpp4
-rw-r--r--src/server/scripts/Commands/cs_mmaps.cpp4
5 files changed, 36 insertions, 8 deletions
diff --git a/src/server/game/Maps/Map.cpp b/src/server/game/Maps/Map.cpp
index a64460e9bf9..c10b85085de 100644
--- a/src/server/game/Maps/Map.cpp
+++ b/src/server/game/Maps/Map.cpp
@@ -24,7 +24,6 @@
#include "Conversation.h"
#include "DatabaseEnv.h"
#include "DB2Stores.h"
-#include "DisableMgr.h"
#include "DynamicTree.h"
#include "GameObjectModel.h"
#include "GameTime.h"
@@ -40,7 +39,6 @@
#include "MapManager.h"
#include "Metric.h"
#include "MiscPackets.h"
-#include "MMapFactory.h"
#include "MotionMaster.h"
#include "ObjectAccessor.h"
#include "ObjectGridLoader.h"
@@ -115,7 +113,7 @@ Map::~Map()
sOutdoorPvPMgr->DestroyOutdoorPvPForMap(this);
sBattlefieldMgr->DestroyBattlefieldsForMap(this);
- MMAP::MMapFactory::createOrGetMMapManager()->unloadMapInstance(GetId(), i_InstanceId);
+ m_terrain->UnloadMMapInstance(GetId(), GetInstanceId());
}
void Map::LoadAllCells()
@@ -172,7 +170,7 @@ i_scriptLock(false), _respawnTimes(std::make_unique<RespawnListContainer>()), _r
sTransportMgr->CreateTransportsForMap(this);
- MMAP::MMapFactory::createOrGetMMapManager()->loadMapInstance(sWorld->GetDataPath(), GetId(), i_InstanceId);
+ m_terrain->LoadMMapInstance(GetId(), GetInstanceId());
_worldStateValues = sWorldStateMgr->GetInitialWorldStatesForMap(this);
diff --git a/src/server/game/Maps/TerrainMgr.cpp b/src/server/game/Maps/TerrainMgr.cpp
index b5c2eeea8f8..10151fa4127 100644
--- a/src/server/game/Maps/TerrainMgr.cpp
+++ b/src/server/game/Maps/TerrainMgr.cpp
@@ -163,6 +163,14 @@ void TerrainInfo::LoadMapAndVMap(int32 gx, int32 gy)
LoadMapAndVMapImpl(gx, gy);
}
+void TerrainInfo::LoadMMapInstance(uint32 mapId, uint32 instanceId)
+{
+ LoadMMapInstanceImpl(mapId, instanceId);
+
+ for (std::shared_ptr<TerrainInfo> const& childTerrain : _childTerrain)
+ childTerrain->LoadMMapInstanceImpl(mapId, instanceId);
+}
+
void TerrainInfo::LoadMapAndVMapImpl(int32 gx, int32 gy)
{
LoadMap(gx, gy);
@@ -175,6 +183,11 @@ void TerrainInfo::LoadMapAndVMapImpl(int32 gx, int32 gy)
_loadedGrids[GetBitsetIndex(gx, gy)] = true;
}
+void TerrainInfo::LoadMMapInstanceImpl(uint32 mapId, uint32 instanceId)
+{
+ MMAP::MMapFactory::createOrGetMMapManager()->loadMapInstance(sWorld->GetDataPath(), _mapId, mapId, instanceId);
+}
+
void TerrainInfo::LoadMap(int32 gx, int32 gy)
{
if (_gridMap[gx][gy])
@@ -240,6 +253,14 @@ void TerrainInfo::UnloadMap(int32 gx, int32 gy)
// unload later
}
+void TerrainInfo::UnloadMMapInstance(uint32 mapId, uint32 instanceId)
+{
+ UnloadMMapInstanceImpl(mapId, instanceId);
+
+ for (std::shared_ptr<TerrainInfo> const& childTerrain : _childTerrain)
+ childTerrain->UnloadMMapInstanceImpl(mapId, instanceId);
+}
+
void TerrainInfo::UnloadMapImpl(int32 gx, int32 gy)
{
_gridMap[gx][gy] = nullptr;
@@ -252,6 +273,11 @@ void TerrainInfo::UnloadMapImpl(int32 gx, int32 gy)
_loadedGrids[GetBitsetIndex(gx, gy)] = false;
}
+void TerrainInfo::UnloadMMapInstanceImpl(uint32 mapId, uint32 instanceId)
+{
+ MMAP::MMapFactory::createOrGetMMapManager()->unloadMapInstance(_mapId, mapId, instanceId);
+}
+
GridMap* TerrainInfo::GetGrid(uint32 mapId, float x, float y, bool loadIfMissing /*= true*/)
{
// half opt method
diff --git a/src/server/game/Maps/TerrainMgr.h b/src/server/game/Maps/TerrainMgr.h
index 638319d7f1d..eb8512f6403 100644
--- a/src/server/game/Maps/TerrainMgr.h
+++ b/src/server/game/Maps/TerrainMgr.h
@@ -56,18 +56,22 @@ public:
void AddChildTerrain(std::shared_ptr<TerrainInfo> childTerrain);
void LoadMapAndVMap(int32 gx, int32 gy);
+ void LoadMMapInstance(uint32 mapId, uint32 instanceId);
private:
void LoadMapAndVMapImpl(int32 gx, int32 gy);
+ void LoadMMapInstanceImpl(uint32 mapId, uint32 instanceId);
void LoadMap(int32 gx, int32 gy);
void LoadVMap(int32 gx, int32 gy);
void LoadMMap(int32 gx, int32 gy);
public:
void UnloadMap(int32 gx, int32 gy);
+ void UnloadMMapInstance(uint32 mapId, uint32 instanceId);
private:
void UnloadMapImpl(int32 gx, int32 gy);
+ void UnloadMMapInstanceImpl(uint32 mapId, uint32 instanceId);
GridMap* GetGrid(uint32 mapId, float x, float y, bool loadIfMissing = true);
diff --git a/src/server/game/Movement/PathGenerator.cpp b/src/server/game/Movement/PathGenerator.cpp
index ec046c78289..c17d54ab7e9 100644
--- a/src/server/game/Movement/PathGenerator.cpp
+++ b/src/server/game/Movement/PathGenerator.cpp
@@ -42,8 +42,8 @@ PathGenerator::PathGenerator(WorldObject const* owner) :
if (DisableMgr::IsPathfindingEnabled(_source->GetMapId()))
{
MMAP::MMapManager* mmap = MMAP::MMapFactory::createOrGetMMapManager();
- _navMesh = mmap->GetNavMesh(mapId);
- _navMeshQuery = mmap->GetNavMeshQuery(mapId, _source->GetInstanceId());
+ _navMeshQuery = mmap->GetNavMeshQuery(mapId, _source->GetMapId(), _source->GetInstanceId());
+ _navMesh = _navMeshQuery ? _navMeshQuery->getAttachedNavMesh() : mmap->GetNavMesh(mapId);
}
CreateFilter();
diff --git a/src/server/scripts/Commands/cs_mmaps.cpp b/src/server/scripts/Commands/cs_mmaps.cpp
index 0477a2d1e54..94004eb8125 100644
--- a/src/server/scripts/Commands/cs_mmaps.cpp
+++ b/src/server/scripts/Commands/cs_mmaps.cpp
@@ -144,7 +144,7 @@ public:
// calculate navmesh tile location
uint32 terrainMapId = PhasingHandler::GetTerrainMapId(player->GetPhaseShift(), player->GetMapId(), player->GetMap()->GetTerrain(), x, y);
dtNavMesh const* navmesh = MMAP::MMapFactory::createOrGetMMapManager()->GetNavMesh(terrainMapId);
- dtNavMeshQuery const* navmeshquery = MMAP::MMapFactory::createOrGetMMapManager()->GetNavMeshQuery(terrainMapId, player->GetInstanceId());
+ dtNavMeshQuery const* navmeshquery = MMAP::MMapFactory::createOrGetMMapManager()->GetNavMeshQuery(terrainMapId, player->GetMapId(), player->GetInstanceId());
if (!navmesh || !navmeshquery)
{
handler->PSendSysMessage("NavMesh not loaded for current map.");
@@ -195,7 +195,7 @@ public:
Player* player = handler->GetSession()->GetPlayer();
uint32 terrainMapId = PhasingHandler::GetTerrainMapId(player->GetPhaseShift(), player->GetMapId(), player->GetMap()->GetTerrain(), player->GetPositionX(), player->GetPositionY());
dtNavMesh const* navmesh = MMAP::MMapFactory::createOrGetMMapManager()->GetNavMesh(terrainMapId);
- dtNavMeshQuery const* navmeshquery = MMAP::MMapFactory::createOrGetMMapManager()->GetNavMeshQuery(terrainMapId, player->GetInstanceId());
+ dtNavMeshQuery const* navmeshquery = MMAP::MMapFactory::createOrGetMMapManager()->GetNavMeshQuery(terrainMapId, player->GetMapId(), player->GetInstanceId());
if (!navmesh || !navmeshquery)
{
handler->PSendSysMessage("NavMesh not loaded for current map.");