From 3a746f931fcf7f397dbaa828d546e72cd03b61a1 Mon Sep 17 00:00:00 2001 From: hondacrx Date: Mon, 25 Jul 2022 22:01:03 -0400 Subject: [PATCH] Core/WorldStates: Allow using -1 in database for MapIDs column to mark worldstates that should be bound to a map and allowed on all maps Port From (https://github.com/TrinityCore/TrinityCore/commit/071be5a0861924521da5df1ce6fc35ee5a7089d4) --- Source/Game/World/WorldStateManager.cs | 40 +++++++++++++++++++------- 1 file changed, 29 insertions(+), 11 deletions(-) diff --git a/Source/Game/World/WorldStateManager.cs b/Source/Game/World/WorldStateManager.cs index d6162a3a8..ce780096e 100644 --- a/Source/Game/World/WorldStateManager.cs +++ b/Source/Game/World/WorldStateManager.cs @@ -29,9 +29,11 @@ namespace Game { public class WorldStateManager : Singleton { + static int AnyMap = -1; + Dictionary _worldStateTemplates = new(); Dictionary _realmWorldStateValues = new(); - Dictionary> _worldStatesByMap = new(); + Dictionary> _worldStatesByMap = new(); WorldStateManager() { } @@ -56,13 +58,13 @@ namespace Game { foreach (string mapIdToken in new StringArray(mapIds, ',')) { - if (!uint.TryParse(mapIdToken, out uint mapId)) + if (!int.TryParse(mapIdToken, out int mapId)) { Log.outError(LogFilter.Sql, $"Table `world_state` contains a world state {id} with non-integer MapID ({mapIdToken}), map ignored"); continue; } - if (!CliDB.MapStorage.ContainsKey(mapId)) + if (!CliDB.MapStorage.ContainsKey(mapId) && mapId != AnyMap) { Log.outError(LogFilter.Sql, $"Table `world_state` contains a world state {id} with invalid MapID ({mapId}), map ignored"); continue; @@ -120,7 +122,7 @@ namespace Game if (!worldState.MapIds.Empty()) { - foreach (uint mapId in worldState.MapIds) + foreach (int mapId in worldState.MapIds) { if (!_worldStatesByMap.ContainsKey(mapId)) _worldStatesByMap[mapId] = new(); @@ -157,8 +159,13 @@ namespace Game if (!worldState.MapIds.Empty()) { - foreach (uint mapId in worldState.MapIds) + foreach (int mapId in worldState.MapIds) + { + if (!_worldStatesByMap.ContainsKey(mapId)) + _worldStatesByMap[mapId] = new(); + _worldStatesByMap[mapId][worldStateId] = value; + } } else _realmWorldStateValues[worldStateId] = value; @@ -187,7 +194,7 @@ namespace Game if (worldStateTemplate == null || worldStateTemplate.MapIds.Empty()) return _realmWorldStateValues.LookupByKey(worldStateId); - if (map == null || !worldStateTemplate.MapIds.Contains(map.GetId())) + if (map == null || (!worldStateTemplate.MapIds.Contains((int)map.GetId()) && !worldStateTemplate.MapIds.Contains(AnyMap))) return 0; return map.GetWorldStateValue(worldStateId); @@ -230,7 +237,7 @@ namespace Game return; } - if (map == null || !worldStateTemplate.MapIds.Contains(map.GetId())) + if (map == null || (!worldStateTemplate.MapIds.Contains((int)map.GetId()) && !worldStateTemplate.MapIds.Contains(AnyMap))) return; map.SetWorldStateValue(worldStateId, value, hidden); @@ -260,10 +267,21 @@ namespace Game public Dictionary GetInitialWorldStatesForMap(Map map) { - if (_worldStatesByMap.TryGetValue(map.GetId(), out Dictionary initialValues)) - return initialValues; + Dictionary initialValues = new(); - return new Dictionary(); + if (_worldStatesByMap.TryGetValue((int)map.GetId(), out Dictionary valuesTemplate)) + { + foreach (var (key, value) in valuesTemplate) + initialValues.Add(key, value); + } + + if (_worldStatesByMap.TryGetValue(AnyMap, out valuesTemplate)) + { + foreach (var (key, value) in valuesTemplate) + initialValues.Add(key, value); + } + + return initialValues; } public void FillInitialWorldStates(InitWorldStates initWorldStates, Map map, uint playerAreaId) @@ -292,7 +310,7 @@ namespace Game public int DefaultValue; public uint ScriptId; - public List MapIds = new(); + public List MapIds = new(); public List AreaIds = new(); } }