diff options
| author | jackpoz <giacomopoz@gmail.com> | 2017-12-02 16:08:48 +0100 |
|---|---|---|
| committer | jackpoz <giacomopoz@gmail.com> | 2017-12-02 16:08:48 +0100 |
| commit | 8e1c74d95a79a366ca755c9ebdc2fdd24c135284 (patch) | |
| tree | 3fc8f4bac9063b5489a549bc92b48f7646fef225 | |
| parent | 3d1ba42f428c6b920240e208c854b0bcd5d664b1 (diff) | |
Core/Spell: Validate spell_dbc DB data on startup
Validate spell_dbc DB data on startup (max effect type, max aura type, max target type).
Delete some invalid spells from spell_dbc table. Make sure to apply the SQL script or worldserver will assert on startup.
| -rw-r--r-- | sql/updates/world/3.3.5/2017_12_02_00_world.sql | 1 | ||||
| -rw-r--r-- | src/server/game/Spells/SpellMgr.cpp | 12 |
2 files changed, 7 insertions, 6 deletions
diff --git a/sql/updates/world/3.3.5/2017_12_02_00_world.sql b/sql/updates/world/3.3.5/2017_12_02_00_world.sql new file mode 100644 index 00000000000..cbcf0331531 --- /dev/null +++ b/sql/updates/world/3.3.5/2017_12_02_00_world.sql @@ -0,0 +1 @@ +DELETE FROM `spell_dbc` WHERE `Effect1` >= 165 OR `Effect2` >= 165 OR `Effect3` >= 165 OR `EffectApplyAuraName1` >= 317 OR `EffectApplyAuraName2` >= 317 OR `EffectApplyAuraName3` >= 317 OR `EffectImplicitTargetA1` >= 111 OR `EffectImplicitTargetA2` >= 111 OR `EffectImplicitTargetA3` >= 111 OR `EffectImplicitTargetB1` >= 111 OR `EffectImplicitTargetB2` >= 111 OR `EffectImplicitTargetB3` >= 111; diff --git a/src/server/game/Spells/SpellMgr.cpp b/src/server/game/Spells/SpellMgr.cpp index b3a37a2073c..ac0bfb0c41d 100644 --- a/src/server/game/Spells/SpellMgr.cpp +++ b/src/server/game/Spells/SpellMgr.cpp @@ -2547,13 +2547,13 @@ void SpellMgr::LoadSpellInfoStore() if (!mSpellInfoMap[spellIndex]) continue; - for (uint32 effectIndex = 0; effectIndex < MAX_SPELL_EFFECTS; ++effectIndex) + for (auto const& effect : mSpellInfoMap[spellIndex]->Effects) { - if (mSpellInfoMap[spellIndex]->Effects[effectIndex].Effect >= TOTAL_SPELL_EFFECTS) - { - TC_LOG_ERROR("sql.sql", "Spell (Entry: %u) has `Effect` '%u' greater than max allowed value '%u', removing", spellIndex, mSpellInfoMap[spellIndex]->Effects[effectIndex].Effect, (TOTAL_SPELL_EFFECTS - 1)); - mSpellInfoMap[spellIndex]->Effects[effectIndex].Effect = 0; - } + //ASSERT(effect.EffectIndex < MAX_SPELL_EFFECTS, "MAX_SPELL_EFFECTS must be at least %u", effect.EffectIndex + 1); + ASSERT(effect.Effect < TOTAL_SPELL_EFFECTS, "TOTAL_SPELL_EFFECTS must be at least %u", effect.Effect + 1); + ASSERT(effect.ApplyAuraName < TOTAL_AURAS, "TOTAL_AURAS must be at least %u", effect.ApplyAuraName + 1); + ASSERT(effect.TargetA.GetTarget() < TOTAL_SPELL_TARGETS, "TOTAL_SPELL_TARGETS must be at least %u", effect.TargetA.GetTarget() + 1); + ASSERT(effect.TargetB.GetTarget() < TOTAL_SPELL_TARGETS, "TOTAL_SPELL_TARGETS must be at least %u", effect.TargetB.GetTarget() + 1); } } |
