From d2edbdeeccb4edf8dcf1cd87dc13e8b7d4376ef6 Mon Sep 17 00:00:00 2001 From: hondacrx Date: Thu, 1 Feb 2024 11:34:50 -0500 Subject: [PATCH] Core/MMaps: Implemented a way to enable/disable certain terrain types for movement on the entire map Port From (https://github.com/TrinityCore/TrinityCore/commit/da0ba86694010fcb1adb5ed88cbc212dd4a33ab5) --- Source/Game/Maps/Map.cs | 21 +++++++++++++++---- .../Game/Movement/Generators/PathGenerator.cs | 3 +++ 2 files changed, 20 insertions(+), 4 deletions(-) diff --git a/Source/Game/Maps/Map.cs b/Source/Game/Maps/Map.cs index 9ff32fbb3..84b6a487b 100644 --- a/Source/Game/Maps/Map.cs +++ b/Source/Game/Maps/Map.cs @@ -3211,6 +3211,17 @@ namespace Game.Maps public TerrainInfo GetTerrain() { return m_terrain; } + // 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 + public ushort GetForceEnabledNavMeshFilterFlags() { return m_forceEnabledNavMeshFilterFlags; } + public void SetForceEnabledNavMeshFilterFlag(ushort flag) { m_forceEnabledNavMeshFilterFlags |= flag; } + public void RemoveForceEnabledNavMeshFilterFlag(ushort flag) { m_forceEnabledNavMeshFilterFlags &= (ushort)~flag; } + + public ushort GetForceDisabledNavMeshFilterFlags() { return m_forceDisabledNavMeshFilterFlags; } + public void SetForceDisabledNavMeshFilterFlag(ushort flag) { m_forceDisabledNavMeshFilterFlags |= flag; } + public void RemoveForceDisabledNavMeshFilterFlag(ushort flag) { m_forceDisabledNavMeshFilterFlags &= (ushort)~flag; } + public uint GetInstanceId() { return i_InstanceId; @@ -4672,6 +4683,8 @@ namespace Game.Maps protected List m_activeNonPlayers = new(); protected List m_activePlayers = new(); TerrainInfo m_terrain; + ushort m_forceEnabledNavMeshFilterFlags; + ushort m_forceDisabledNavMeshFilterFlags; SortedMultiMap m_scriptSchedule = new(); @@ -4900,7 +4913,7 @@ namespace Game.Maps } public Group GetOwningGroup() { return i_owningGroupRef.GetTarget(); } - + public void TrySetOwningGroup(Group group) { if (!i_owningGroupRef.IsValid()) @@ -4981,7 +4994,7 @@ namespace Game.Maps SQLTransaction trans = new(); if (entries.IsInstanceIdBound()) - Global.InstanceLockMgr.UpdateSharedInstanceLock(trans, new InstanceLockUpdateEvent(GetInstanceId(), i_data.GetSaveData(), + Global.InstanceLockMgr.UpdateSharedInstanceLock(trans, new InstanceLockUpdateEvent(GetInstanceId(), i_data.GetSaveData(), instanceCompletedEncounters, updateSaveDataEvent.DungeonEncounter, i_data.GetEntranceLocationForCompletedEncounters(instanceCompletedEncounters))); foreach (var player in GetPlayers()) @@ -5017,7 +5030,7 @@ namespace Game.Maps DB.Characters.CommitTransaction(trans); } } - + public void UpdateInstanceLock(UpdateAdditionalSaveDataEvent updateSaveDataEvent) { if (i_instanceLock != null) @@ -5208,7 +5221,7 @@ namespace Game.Maps MapDifficultyXConditionId = mapDifficultyXConditionId; } } - + public struct ScriptAction { public ObjectGuid ownerGUID; diff --git a/Source/Game/Movement/Generators/PathGenerator.cs b/Source/Game/Movement/Generators/PathGenerator.cs index ef1c84188..7ad8587cf 100644 --- a/Source/Game/Movement/Generators/PathGenerator.cs +++ b/Source/Game/Movement/Generators/PathGenerator.cs @@ -868,6 +868,9 @@ namespace Game.Movement void UpdateFilter() { + _filter.setIncludeFlags((ushort)(_filter.getIncludeFlags() | _source.GetMap().GetForceEnabledNavMeshFilterFlags())); + _filter.setExcludeFlags((ushort)(_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 Unit _sourceUnit = _source.ToUnit();