diff options
author | Shauren <shauren.trinity@gmail.com> | 2016-08-21 11:54:55 +0200 |
---|---|---|
committer | Shauren <shauren.trinity@gmail.com> | 2016-08-21 11:54:55 +0200 |
commit | 45966e66857ecea47172cb3d3f97284e9d3d5679 (patch) | |
tree | 890398b6adbaa55e04f33a8e3109aaf4f837cae6 | |
parent | 7751ce574b2e98d523eda1a843b2fca684a59875 (diff) |
Core/Criteria: Fixed `disables` table requiring a reload for achievement criteria
Closes #17828
-rw-r--r-- | src/server/game/Conditions/DisableMgr.cpp | 24 | ||||
-rw-r--r-- | src/server/game/Conditions/DisableMgr.h | 4 |
2 files changed, 12 insertions, 16 deletions
diff --git a/src/server/game/Conditions/DisableMgr.cpp b/src/server/game/Conditions/DisableMgr.cpp index 21957198bac..43c9d928107 100644 --- a/src/server/game/Conditions/DisableMgr.cpp +++ b/src/server/game/Conditions/DisableMgr.cpp @@ -42,17 +42,13 @@ namespace struct DisableData { uint8 flags; - std::set<uint32> params[2]; // params0, params1 + std::unordered_set<uint32> params[2]; // params0, params1 }; // single disables here with optional data - typedef std::map<uint32, DisableData> DisableTypeMap; - // global disable map by source - typedef std::map<DisableType, DisableTypeMap> DisableMap; + typedef std::unordered_map<uint32, DisableData> DisableTypeMap; - DisableMap m_DisableMap; - - uint8 MAX_DISABLE_TYPES = 8; + std::array<DisableTypeMap, MAX_DISABLE_TYPES> m_DisableMap; } void LoadDisables() @@ -60,10 +56,8 @@ void LoadDisables() uint32 oldMSTime = getMSTime(); // reload case - for (DisableMap::iterator itr = m_DisableMap.begin(); itr != m_DisableMap.end(); ++itr) - itr->second.clear(); - - m_DisableMap.clear(); + for (std::size_t i = 0; i < m_DisableMap.size(); ++i) + m_DisableMap[i].clear(); QueryResult result = WorldDatabase.Query("SELECT sourceType, entry, flags, params_0, params_1 FROM disables"); @@ -184,7 +178,7 @@ void LoadDisables() TC_LOG_ERROR("sql.sql", "Disable flags specified for outdoor PvP %u, useless data.", entry); break; case DISABLE_TYPE_CRITERIA: - if (!sCriteriaMgr->GetCriteria(entry)) + if (!sCriteriaStore.LookupEntry(entry)) { TC_LOG_ERROR("sql.sql", "Criteria entry %u from `disables` doesn't exist in dbc, skipped.", entry); continue; @@ -237,7 +231,7 @@ void LoadDisables() break; } - m_DisableMap[type].insert(DisableTypeMap::value_type(entry, data)); + m_DisableMap[type][entry] = std::move(data); ++total_count; } while (result->NextRow()); @@ -296,7 +290,7 @@ bool IsDisabledFor(DisableType type, uint32 entry, Unit const* unit, uint8 flags { if (spellFlags & SPELL_DISABLE_MAP) { - std::set<uint32> const& mapIds = itr->second.params[0]; + std::unordered_set<uint32> const& mapIds = itr->second.params[0]; if (mapIds.find(unit->GetMapId()) != mapIds.end()) return true; // Spell is disabled on current map @@ -308,7 +302,7 @@ bool IsDisabledFor(DisableType type, uint32 entry, Unit const* unit, uint8 flags if (spellFlags & SPELL_DISABLE_AREA) { - std::set<uint32> const& areaIds = itr->second.params[1]; + std::unordered_set<uint32> const& areaIds = itr->second.params[1]; if (areaIds.find(unit->GetAreaId()) != areaIds.end()) return true; // Spell is disabled in this area return false; // Spell is disabled in another area, but not this one, return false diff --git a/src/server/game/Conditions/DisableMgr.h b/src/server/game/Conditions/DisableMgr.h index 95e54932f15..85d3c40d604 100644 --- a/src/server/game/Conditions/DisableMgr.h +++ b/src/server/game/Conditions/DisableMgr.h @@ -33,7 +33,9 @@ enum DisableType DISABLE_TYPE_CRITERIA = 4, DISABLE_TYPE_OUTDOORPVP = 5, DISABLE_TYPE_VMAP = 6, - DISABLE_TYPE_MMAP = 7 + DISABLE_TYPE_MMAP = 7, + + MAX_DISABLE_TYPES }; enum SpellDisableTypes |