From 353b06d16ea7cb0be56344b7171c6ca89219e2b8 Mon Sep 17 00:00:00 2001 From: Shauren Date: Thu, 29 Dec 2022 22:15:58 +0100 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 --- .../game/World/WorldStates/WorldStateMgr.cpp | 20 +++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/src/server/game/World/WorldStates/WorldStateMgr.cpp b/src/server/game/World/WorldStates/WorldStateMgr.cpp index f5c48ea9e9..d395324062 100644 --- a/src/server/game/World/WorldStates/WorldStateMgr.cpp +++ b/src/server/game/World/WorldStates/WorldStateMgr.cpp @@ -28,9 +28,10 @@ namespace { + constexpr int32 WORLDSTATE_ANY_MAP = -1; std::unordered_map _worldStateTemplates; WorldStateValueContainer _realmWorldStateValues; - std::unordered_map _worldStatesByMap; + std::unordered_map _worldStatesByMap; } void WorldStateMgr::LoadFromDB() @@ -55,7 +56,7 @@ void WorldStateMgr::LoadFromDB() uint8 i = 0; for (Tokenizer::const_iterator itr = tokens.begin(); itr != tokens.end(); ++itr, ++i) { - uint32 mapId = atoul(*itr); + int32 mapId = atoi(*itr); if (!mapId) { TC_LOG_ERROR("sql.sql", "Table `world_state` contains a world state %d with non-integer MapID (%s), map ignored", @@ -63,7 +64,7 @@ void WorldStateMgr::LoadFromDB() continue; } - if (!sMapStore.LookupEntry(mapId)) + if (!sMapStore.LookupEntry(mapId) && mapId != WORLDSTATE_ANY_MAP) { TC_LOG_ERROR("sql.sql", "Table `world_state` contains a world state %d with invalid MapID (%u), map ignored", id, mapId); @@ -129,7 +130,7 @@ void WorldStateMgr::LoadFromDB() if (!worldState.MapIds.empty()) { - for (uint32 mapId : worldState.MapIds) + for (int32 mapId : worldState.MapIds) _worldStatesByMap[mapId][id] = worldState.DefaultValue; } else @@ -160,7 +161,7 @@ void WorldStateMgr::LoadFromDB() if (!worldState->MapIds.empty()) { - for (uint32 mapId : worldState->MapIds) + for (int32 mapId : worldState->MapIds) _worldStatesByMap[mapId][worldStateId] = value; } else @@ -189,7 +190,7 @@ int32 WorldStateMgr::GetValue(int32 worldStateId, Map const* map) const return 0; } - if (!map || worldStateTemplate->MapIds.find(map->GetId()) == worldStateTemplate->MapIds.end()) + if (!map || (!worldStateTemplate->MapIds.count(map->GetId()) && !worldStateTemplate->MapIds.count(WORLDSTATE_ANY_MAP))) return 0; return map->GetWorldStateValue(worldStateId); @@ -219,7 +220,7 @@ void WorldStateMgr::SetValue(int32 worldStateId, int32 value, bool hidden, Map* return; } - if (!map || worldStateTemplate->MapIds.find(map->GetId()) == worldStateTemplate->MapIds.end()) + if (!map || (!worldStateTemplate->MapIds.count(map->GetId()) && !worldStateTemplate->MapIds.count(WORLDSTATE_ANY_MAP))) return; map->SetWorldStateValue(worldStateId, value, hidden); @@ -246,7 +247,10 @@ WorldStateValueContainer WorldStateMgr::GetInitialWorldStatesForMap(Map const* m { WorldStateValueContainer initialValues; if (WorldStateValueContainer const* valuesTemplate = Trinity::Containers::MapGetValuePtr(_worldStatesByMap, map->GetId())) - initialValues = *valuesTemplate; + initialValues.insert(valuesTemplate->begin(), valuesTemplate->end()); + + if (WorldStateValueContainer const* valuesTemplate = Trinity::Containers::MapGetValuePtr(_worldStatesByMap, WORLDSTATE_ANY_MAP)) + initialValues.insert(valuesTemplate->begin(), valuesTemplate->end()); return initialValues; }