From 071be5a0861924521da5df1ce6fc35ee5a7089d4 Mon Sep 17 00:00:00 2001 From: Shauren Date: Sun, 24 Jul 2022 20:05:37 +0200 Subject: 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 | 22 +++++++++++++--------- 1 file changed, 13 insertions(+), 9 deletions(-) (limited to 'src') diff --git a/src/server/game/World/WorldStates/WorldStateMgr.cpp b/src/server/game/World/WorldStates/WorldStateMgr.cpp index 2877cfdd899..6d81f0f78c6 100644 --- a/src/server/game/World/WorldStates/WorldStateMgr.cpp +++ b/src/server/game/World/WorldStates/WorldStateMgr.cpp @@ -30,9 +30,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() @@ -56,7 +57,7 @@ void WorldStateMgr::LoadFromDB() std::string_view mapIds = fields[2].GetStringView(); for (std::string_view mapIdToken : Trinity::Tokenize(mapIds, ',', false)) { - Optional mapId = Trinity::StringTo(mapIdToken); + Optional mapId = Trinity::StringTo(mapIdToken); if (!mapId) { TC_LOG_ERROR("sql.sql", "Table `world_state` contains a world state %d with non-integer MapID (" STRING_VIEW_FMT "), map ignored", @@ -64,9 +65,9 @@ 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", + TC_LOG_ERROR("sql.sql", "Table `world_state` contains a world state %d with invalid MapID (%d), map ignored", id, *mapId); continue; } @@ -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 @@ -190,7 +191,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); @@ -220,7 +221,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); @@ -247,7 +248,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; } -- cgit v1.2.3