aboutsummaryrefslogtreecommitdiff
path: root/src/server/game/Spells/SpellMgr.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/server/game/Spells/SpellMgr.cpp')
-rw-r--r--src/server/game/Spells/SpellMgr.cpp53
1 files changed, 53 insertions, 0 deletions
diff --git a/src/server/game/Spells/SpellMgr.cpp b/src/server/game/Spells/SpellMgr.cpp
index ecc2af47afb..2d4fc015a91 100644
--- a/src/server/game/Spells/SpellMgr.cpp
+++ b/src/server/game/Spells/SpellMgr.cpp
@@ -32,6 +32,7 @@
#include "Spell.h"
#include "SpellAuraDefines.h"
#include "SpellInfo.h"
+#include "StringConvert.h"
#include <G3D/g3dmath.h>
#include <boost/multi_index_container.hpp>
#include <boost/multi_index/composite_key.hpp>
@@ -97,6 +98,7 @@ namespace
std::vector<ServersideSpellName> mServersideSpellNames;
std::unordered_map<std::pair<uint32, Difficulty>, SpellProcEntry> mSpellProcMap;
+ std::unordered_map<int32, CreatureImmunities> mCreatureImmunities;
}
PetFamilySpellsStore sPetFamilySpellsStore;
@@ -672,6 +674,11 @@ SpellAreaForAreaMapBounds SpellMgr::GetSpellAreaForAreaMapBounds(uint32 area_id)
return mSpellAreaForAreaMap.equal_range(area_id);
}
+CreatureImmunities const* SpellMgr::GetCreatureImmunities(int32 creatureImmunitiesId)
+{
+ return Trinity::Containers::MapGetValuePtr(mCreatureImmunities, creatureImmunitiesId);
+}
+
SpellInfo const* SpellMgr::GetSpellInfo(uint32 spellId, Difficulty difficulty) const
{
auto itr = mSpellInfoMap.find(boost::make_tuple(spellId, difficulty));
@@ -4946,6 +4953,52 @@ void SpellMgr::LoadSpellInfoImmunities()
{
uint32 oldMSTime = getMSTime();
+ mCreatureImmunities.clear();
+
+ // 0 1 2 3 4 5 6 7
+ if (QueryResult result = WorldDatabase.Query("SELECT ID, SchoolMask, DispelTypeMask, MechanicsMask, Effects, Auras, ImmuneAoE, ImmuneChain FROM creature_immunities"))
+ {
+ do
+ {
+ Field* fields = result->Fetch();
+ int32 id = fields[0].GetInt32();
+ uint8 school = fields[1].GetInt8();
+ uint16 dispelType = fields[2].GetInt16();
+ uint64 mechanics = fields[3].GetInt64();
+
+ CreatureImmunities& immunities = mCreatureImmunities[id];
+ immunities.School = school;
+ immunities.DispelType = dispelType;
+ immunities.Mechanic = mechanics;
+ immunities.ImmuneAoE = fields[6].GetBool();
+ immunities.ImmuneChain = fields[7].GetBool();
+
+ if (immunities.School.to_ullong() != school)
+ TC_LOG_ERROR("sql.sql", "Invalid value in `SchoolMask` {} for creature immunities {}, truncated", school, id);
+ if (immunities.DispelType.to_ullong() != dispelType)
+ TC_LOG_ERROR("sql.sql", "Invalid value in `DispelTypeMask` {} for creature immunities {}, truncated", dispelType, id);
+ if (immunities.Mechanic.to_ullong() != mechanics)
+ TC_LOG_ERROR("sql.sql", "Invalid value in `MechanicsMask` {} for creature immunities {}, truncated", mechanics, id);
+
+ for (std::string_view token : Trinity::Tokenize(fields[4].GetStringView(), ',', false))
+ {
+ if (Optional<uint32> effect = Trinity::StringTo<uint32>(token); effect && effect < uint32(TOTAL_SPELL_EFFECTS))
+ immunities.Effect.push_back(SpellEffectName(*effect));
+ else
+ TC_LOG_ERROR("sql.sql", "Invalid effect type in `Effects` {} for creature immunities {}, skipped", token, id);
+ }
+
+ for (std::string_view token : Trinity::Tokenize(fields[5].GetStringView(), ',', false))
+ {
+ if (Optional<uint32> aura = Trinity::StringTo<uint32>(token); aura && aura < TOTAL_AURAS)
+ immunities.Aura.push_back(AuraType(*aura));
+ else
+ TC_LOG_ERROR("sql.sql", "Invalid aura type in `Auras` {} for creature immunities {}, skipped", token, id);
+ }
+ }
+ while (result->NextRow());
+ }
+
for (SpellInfo const& spellInfo : mSpellInfoMap)
const_cast<SpellInfo&>(spellInfo)._LoadImmunityInfo();