mirror of
https://github.com/TrinityCore/TrinityCore.git
synced 2026-01-26 03:42:37 +01:00
Core/Criteria: Fixed disables table requiring a reload for achievement criteria
Closes #17828
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user