diff options
| author | Shauren <shauren.trinity@gmail.com> | 2023-08-08 00:08:10 +0200 |
|---|---|---|
| committer | Shauren <shauren.trinity@gmail.com> | 2023-08-08 00:08:10 +0200 |
| commit | 86725ed9267803506d8a5cab04c2c5641a234dd9 (patch) | |
| tree | c54196bde8686914d3396059a3ea4de34b6ed346 /src/server | |
| parent | c489e2620759819b79a728ffaf62bc144b8e0438 (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.cpp | 6 | ||||
| -rw-r--r-- | src/server/game/Maps/TerrainMgr.cpp | 26 | ||||
| -rw-r--r-- | src/server/game/Maps/TerrainMgr.h | 4 | ||||
| -rw-r--r-- | src/server/game/Movement/PathGenerator.cpp | 4 | ||||
| -rw-r--r-- | src/server/scripts/Commands/cs_mmaps.cpp | 4 |
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."); |
