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.cpp31
1 files changed, 31 insertions, 0 deletions
diff --git a/src/server/game/Maps/Map.cpp b/src/server/game/Maps/Map.cpp
index 3a8e3c4cc56..c886f41ae44 100644
--- a/src/server/game/Maps/Map.cpp
+++ b/src/server/game/Maps/Map.cpp
@@ -25,6 +25,7 @@
#include "DB2Stores.h"
#include "DatabaseEnv.h"
#include "DynamicTree.h"
+#include "DynamicMMapTileBuilder.h"
#include "GameObjectModel.h"
#include "GameTime.h"
#include "GridNotifiers.h"
@@ -36,6 +37,7 @@
#include "InstanceScenario.h"
#include "InstanceScript.h"
#include "Log.h"
+#include "MMapManager.h"
#include "MapManager.h"
#include "MapUtils.h"
#include "Metric.h"
@@ -154,6 +156,9 @@ i_scriptLock(false), _respawnTimes(std::make_unique<RespawnListContainer>()), _r
m_terrain->LoadMMapInstance(GetId(), GetInstanceId());
+ if (MMAP::MMapManager::isRebuildingTilesEnabledOnMap(GetId()))
+ m_mmapTileRebuilder = std::make_shared<MMAP::DynamicTileBuilder>(this, MMAP::MMapManager::instance()->GetNavMesh(GetId(), GetInstanceId()));
+
_worldStateValues = sWorldStateMgr->GetInitialWorldStatesForMap(this);
}
@@ -290,6 +295,7 @@ void Map::EnsureGridCreated(GridCoord const& p)
int gy = (MAX_NUMBER_OF_GRIDS - 1) - p.y_coord;
m_terrain->LoadMapAndVMap(gx, gy);
+ m_terrain->LoadMMap(GetInstanceId(), gx, gy);
}
}
@@ -647,6 +653,9 @@ void Map::UpdatePlayerZoneStats(uint32 oldZone, uint32 newZone)
void Map::Update(uint32 t_diff)
{
_dynamicTree.update(t_diff);
+ if (m_mmapTileRebuilder)
+ m_mmapTileRebuilder->Update(Milliseconds(t_diff));
+
/// update worldsessions for existing players
for (m_mapRefIter = m_mapRefManager.begin(); m_mapRefIter != m_mapRefManager.end(); ++m_mapRefIter)
{
@@ -1763,6 +1772,28 @@ bool Map::getObjectHitPos(PhaseShift const& phaseShift, float x1, float y1, floa
return result;
}
+void Map::RequestRebuildNavMeshOnGameObjectModelChange(GameObjectModel const& model, PhaseShift const& phaseShift)
+{
+ if (!m_mmapTileRebuilder)
+ return;
+
+ uint32 terrainMapId = PhasingHandler::GetTerrainMapId(phaseShift, GetId(), m_terrain.get(), model.GetPosition().x, model.GetPosition().y);
+
+ G3D::AABox const& bounds = model.getBounds();
+
+ GridCoord low = Trinity::ComputeGridCoord(bounds.high().x, bounds.high().y);
+ low.x_coord = (MAX_NUMBER_OF_GRIDS - 1) - low.x_coord;
+ low.y_coord = (MAX_NUMBER_OF_GRIDS - 1) - low.y_coord;
+
+ GridCoord high = Trinity::ComputeGridCoord(bounds.low().x, bounds.low().y);
+ high.x_coord = (MAX_NUMBER_OF_GRIDS - 1) - high.x_coord;
+ high.y_coord = (MAX_NUMBER_OF_GRIDS - 1) - high.y_coord;
+
+ for (uint32 x = low.x_coord; x <= high.x_coord; ++x)
+ for (uint32 y = low.y_coord; y <= high.y_coord; ++y)
+ m_mmapTileRebuilder->AddTile(terrainMapId, x, y);
+}
+
TransferAbortParams Map::PlayerCannotEnter(uint32 mapid, Player* player)
{
MapEntry const* entry = sMapStore.LookupEntry(mapid);