From 7b4371e25ddf0427d05f53cc65bc4a5adbd3018c Mon Sep 17 00:00:00 2001 From: Shauren Date: Wed, 18 Oct 2023 21:55:21 +0200 Subject: [PATCH] Core/MMaps: Implemented a way to enable/disable certain terrain types for movement on the entire map --- src/server/game/Maps/Map.cpp | 2 +- src/server/game/Maps/Map.h | 14 ++++++++++++++ src/server/game/Movement/PathGenerator.cpp | 3 +++ 3 files changed, 18 insertions(+), 1 deletion(-) diff --git a/src/server/game/Maps/Map.cpp b/src/server/game/Maps/Map.cpp index 7e299fb751..9316879ce3 100644 --- a/src/server/game/Maps/Map.cpp +++ b/src/server/game/Maps/Map.cpp @@ -127,7 +127,7 @@ i_mapEntry(sMapStore.LookupEntry(id)), i_spawnMode(SpawnMode), i_InstanceId(Inst m_unloadTimer(0), m_VisibleDistance(DEFAULT_VISIBILITY_DISTANCE), m_VisibilityNotifyPeriod(DEFAULT_VISIBILITY_NOTIFY_PERIOD), m_activeNonPlayersIter(m_activeNonPlayers.end()), _transportsUpdateIter(_transports.end()), -i_gridExpiry(expiry), m_terrain(sTerrainMgr.LoadTerrain(id)), +i_gridExpiry(expiry), m_terrain(sTerrainMgr.LoadTerrain(id)), m_forceEnabledNavMeshFilterFlags(0), m_forceDisabledNavMeshFilterFlags(0), i_scriptLock(false), _respawnCheckTimer(0) { for (uint32 x = 0; x < MAX_NUMBER_OF_GRIDS; ++x) diff --git a/src/server/game/Maps/Map.h b/src/server/game/Maps/Map.h index 1ce522d517..b1cbf09f65 100644 --- a/src/server/game/Maps/Map.h +++ b/src/server/game/Maps/Map.h @@ -239,6 +239,18 @@ class TC_GAME_API Map : public GridRefManager TerrainInfo* GetTerrain() const { return m_terrain.get(); } + // custom PathGenerator include and exclude filter flags + // these modify what kind of terrain types are available in current instance + // for example this can be used to mark offmesh connections as enabled/disabled + uint16 GetForceEnabledNavMeshFilterFlags() const { return m_forceEnabledNavMeshFilterFlags; } + void SetForceEnabledNavMeshFilterFlag(uint16 flag) { m_forceEnabledNavMeshFilterFlags |= flag; } + void RemoveForceEnabledNavMeshFilterFlag(uint16 flag) { m_forceEnabledNavMeshFilterFlags &= ~flag; } + + uint16 GetForceDisabledNavMeshFilterFlags() const { return m_forceDisabledNavMeshFilterFlags; } + void SetForceDisabledNavMeshFilterFlag(uint16 flag) { m_forceDisabledNavMeshFilterFlags |= flag; } + void RemoveForceDisabledNavMeshFilterFlag(uint16 flag) { m_forceDisabledNavMeshFilterFlags &= ~flag; } + + void GetFullTerrainStatusForPosition(PhaseShift const& phaseShift, float x, float y, float z, PositionFullTerrainStatus& data, map_liquidHeaderTypeFlags reqLiquidType = map_liquidHeaderTypeFlags::AllLiquids, float collisionHeight = 2.03128f); // DEFAULT_COLLISION_HEIGHT in Object.h ZLiquidStatus GetLiquidStatus(PhaseShift const& phaseShift, float x, float y, float z, map_liquidHeaderTypeFlags ReqLiquidType, LiquidData* data = nullptr, float collisionHeight = 2.03128f); // DEFAULT_COLLISION_HEIGHT in Object.h @@ -583,6 +595,8 @@ class TC_GAME_API Map : public GridRefManager time_t i_gridExpiry; std::shared_ptr m_terrain; + uint16 m_forceEnabledNavMeshFilterFlags; + uint16 m_forceDisabledNavMeshFilterFlags; NGridType* i_grids[MAX_NUMBER_OF_GRIDS][MAX_NUMBER_OF_GRIDS]; std::bitset marked_cells; diff --git a/src/server/game/Movement/PathGenerator.cpp b/src/server/game/Movement/PathGenerator.cpp index e60ede3538..de13a24843 100644 --- a/src/server/game/Movement/PathGenerator.cpp +++ b/src/server/game/Movement/PathGenerator.cpp @@ -691,6 +691,9 @@ void PathGenerator::CreateFilter() void PathGenerator::UpdateFilter() { + _filter.setIncludeFlags(_filter.getIncludeFlags() | _source->GetMap()->GetForceEnabledNavMeshFilterFlags()); + _filter.setExcludeFlags(_filter.getExcludeFlags() | _source->GetMap()->GetForceDisabledNavMeshFilterFlags()); + // allow creatures to cheat and use different movement types if they are moved // forcefully into terrain they can't normally move in if (const Unit* _sourceUnit = _source->ToUnit())