diff --git a/sql/updates/world/4.3.4/2022_12_29_00_world.sql b/sql/updates/world/4.3.4/2022_12_29_00_world.sql new file mode 100644 index 0000000000..dbcecc599e --- /dev/null +++ b/sql/updates/world/4.3.4/2022_12_29_00_world.sql @@ -0,0 +1,7 @@ +DELETE FROM `spell_script_names` WHERE `ScriptName`= 'spell_item_obsidian_armor'; +INSERT INTO `spell_script_names` (`spell_id`, `ScriptName`) VALUES +(27539, 'spell_item_obsidian_armor'); + +DELETE FROM `spell_proc` WHERE `SpellId`= 27539; +INSERT INTO `spell_proc` (`SpellId`, `SpellTypeMask`, `Cooldown`) VALUES +(27539, 0x1, 10000); -- 10s cooldown diff --git a/src/server/scripts/Spells/spell_item.cpp b/src/server/scripts/Spells/spell_item.cpp index 0e5836c225..cbb9e10bc4 100644 --- a/src/server/scripts/Spells/spell_item.cpp +++ b/src/server/scripts/Spells/spell_item.cpp @@ -5104,6 +5104,62 @@ class spell_item_blaze_of_life : public SpellScript } }; +enum ItemObsidianArmor +{ + SPELL_FIRE_RESISTANCE = 27533, + SPELL_ARCANCE_RESISTANCE = 27540, + SPELL_NATURE_RESISTANCE = 27538, + SPELL_HOLY_RESISTANCE = 27536, + SPELL_SHADOW_RESISTANCE = 27535, + SPELL_FROST_RESISTANCE = 27534, + +}; + +static std::array const ResistanceSpellsBySchool = +{ + 0, // SPELL_SCHOOL_NORMAL - no shield + SPELL_HOLY_RESISTANCE, // SPELL_SCHOOL_HOLY + SPELL_FIRE_RESISTANCE, // SPELL_SCHOOL_FIRE + SPELL_NATURE_RESISTANCE, // SPELL_SCHOOL_NATURE + SPELL_FROST_RESISTANCE, // SPELL_SCHOOL_FROST + SPELL_SHADOW_RESISTANCE, // SPELL_SCHOOL_SHADOW + SPELL_ARCANCE_RESISTANCE // SPELL_SCHOOL_ARCANE +}; + +// 27539 - Obsidian Armor +class spell_item_obsidian_armor : public AuraScript +{ + bool Validate(SpellInfo const* /*spell*/) override + { + return ValidateSpellInfo( + { + SPELL_HOLY_RESISTANCE, + SPELL_FIRE_RESISTANCE, + SPELL_NATURE_RESISTANCE, + SPELL_FROST_RESISTANCE, + SPELL_SHADOW_RESISTANCE, + SPELL_ARCANCE_RESISTANCE + }); + } + + void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) + { + PreventDefaultAction(); + + // There are spells which have multiple schools (Frostfire Bolt for example). So we proc multiple shields + for (uint8 i = SPELL_SCHOOL_HOLY; i < MAX_SPELL_SCHOOL; ++i) + { + if ((eventInfo.GetSpellInfo()->GetSchoolMask() & (1 << i)) != 0) + GetTarget()->CastSpell(GetTarget(), ResistanceSpellsBySchool[i], aurEff); + } + } + + void Register() override + { + OnEffectProc.Register(&spell_item_obsidian_armor::HandleProc, EFFECT_0, SPELL_AURA_DUMMY); + } +}; + void AddSC_item_spell_scripts() { // 23074 Arcanite Dragonling @@ -5240,4 +5296,5 @@ void AddSC_item_spell_scripts() RegisterSpellScript(spell_item_jom_gabbar); RegisterSpellScript(spell_item_satisfied); RegisterSpellScript(spell_item_blaze_of_life); + RegisterSpellScript(spell_item_obsidian_armor); }