diff --git a/data/sql/updates/pending_db_world/rev_1717886186186050826.sql b/data/sql/updates/pending_db_world/rev_1717886186186050826.sql new file mode 100644 index 000000000..c6fc9ff7c --- /dev/null +++ b/data/sql/updates/pending_db_world/rev_1717886186186050826.sql @@ -0,0 +1,4 @@ +-- +UPDATE `spell_script_names` SET `ScriptName`='spell_four_horsemen_mark_aura' WHERE `spell_id` IN (28832, 28833, 28834, 28835); +UPDATE `spell_script_names` SET `ScriptName`='spell_grobbulus_mutating_injection_aura' WHERE `spell_id`=28169; +UPDATE `spell_script_names` SET `ScriptName`='spell_kelthuzad_detonate_mana_aura' WHERE `spell_id`=27819; diff --git a/src/server/scripts/Northrend/Naxxramas/boss_four_horsemen.cpp b/src/server/scripts/Northrend/Naxxramas/boss_four_horsemen.cpp index c3bd17fa1..9da029cf3 100644 --- a/src/server/scripts/Northrend/Naxxramas/boss_four_horsemen.cpp +++ b/src/server/scripts/Northrend/Naxxramas/boss_four_horsemen.cpp @@ -380,66 +380,60 @@ public: }; }; -class spell_four_horsemen_mark : public SpellScriptLoader +class spell_four_horsemen_mark_aura : public AuraScript { -public: - spell_four_horsemen_mark() : SpellScriptLoader("spell_four_horsemen_mark") { } + PrepareAuraScript(spell_four_horsemen_mark_aura); - class spell_four_horsemen_mark_AuraScript : public AuraScript + bool Validate(SpellInfo const* /*spellInfo*/) override { - PrepareAuraScript(spell_four_horsemen_mark_AuraScript); + return ValidateSpellInfo({ SPELL_MARK_DAMAGE }); + } - void OnApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + void OnApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + { + if (Unit* caster = GetCaster()) { - if (Unit* caster = GetCaster()) + int32 damage; + switch (GetStackAmount()) { - int32 damage; - switch (GetStackAmount()) - { - case 1: - damage = 0; - break; - case 2: - damage = 500; - break; - case 3: - damage = 1500; - break; - case 4: - damage = 4000; - break; - case 5: - damage = 12500; - break; - case 6: - damage = 20000; - break; - default: - damage = 20000 + 1000 * (GetStackAmount() - 7); - break; - } - if (damage) - { - caster->CastCustomSpell(SPELL_MARK_DAMAGE, SPELLVALUE_BASE_POINT0, damage, GetTarget()); - } + case 1: + damage = 0; + break; + case 2: + damage = 500; + break; + case 3: + damage = 1500; + break; + case 4: + damage = 4000; + break; + case 5: + damage = 12500; + break; + case 6: + damage = 20000; + break; + default: + damage = 20000 + 1000 * (GetStackAmount() - 7); + break; + } + if (damage) + { + caster->CastCustomSpell(SPELL_MARK_DAMAGE, SPELLVALUE_BASE_POINT0, damage, GetTarget()); } } + } - void Register() override - { - AfterEffectApply += AuraEffectApplyFn(spell_four_horsemen_mark_AuraScript::OnApply, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL_OR_REAPPLY_MASK); - } - }; - - AuraScript* GetAuraScript() const override + void Register() override { - return new spell_four_horsemen_mark_AuraScript(); + AfterEffectApply += AuraEffectApplyFn(spell_four_horsemen_mark_aura::OnApply, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL_OR_REAPPLY_MASK); } }; void AddSC_boss_four_horsemen() { new boss_four_horsemen(); - new spell_four_horsemen_mark(); + RegisterSpellScript(spell_four_horsemen_mark_aura); } diff --git a/src/server/scripts/Northrend/Naxxramas/boss_gluth.cpp b/src/server/scripts/Northrend/Naxxramas/boss_gluth.cpp index 9f98655d0..9fddd3647 100644 --- a/src/server/scripts/Northrend/Naxxramas/boss_gluth.cpp +++ b/src/server/scripts/Northrend/Naxxramas/boss_gluth.cpp @@ -29,6 +29,7 @@ enum Spells SPELL_ENRAGE_25 = 54427, SPELL_DECIMATE_10 = 28374, SPELL_DECIMATE_25 = 54426, + SPELL_DECIMATE_DAMAGE = 28375, SPELL_BERSERK = 26662, SPELL_INFECTED_WOUND = 29306, SPELL_CHOW_SEARCHER = 28404 @@ -237,50 +238,44 @@ public: }; }; -class spell_gluth_decimate : public SpellScriptLoader +class spell_gluth_decimate : public SpellScript { -public: - spell_gluth_decimate() : SpellScriptLoader("spell_gluth_decimate") { } + PrepareSpellScript(spell_gluth_decimate); - class spell_gluth_decimate_SpellScript : public SpellScript + bool Validate(SpellInfo const* /*spellInfo*/) override { - PrepareSpellScript(spell_gluth_decimate_SpellScript); + return ValidateSpellInfo({ SPELL_DECIMATE_DAMAGE }); + } - void HandleScriptEffect(SpellEffIndex /*effIndex*/) + void HandleScriptEffect(SpellEffIndex /*effIndex*/) + { + if (Unit* unitTarget = GetHitUnit()) { - if (Unit* unitTarget = GetHitUnit()) + int32 damage = int32(unitTarget->GetHealth()) - int32(unitTarget->CountPctFromMaxHealth(5)); + if (damage <= 0) + return; + + if (Creature* cTarget = unitTarget->ToCreature()) { - int32 damage = int32(unitTarget->GetHealth()) - int32(unitTarget->CountPctFromMaxHealth(5)); - if (damage <= 0) - return; - - if (Creature* cTarget = unitTarget->ToCreature()) - { - cTarget->SetWalk(true); - cTarget->GetMotionMaster()->MoveFollow(GetCaster(), 0.0f, 0.0f, MOTION_SLOT_CONTROLLED); - cTarget->SetReactState(REACT_PASSIVE); - Unit::DealDamage(GetCaster(), cTarget, damage); - return; - } - GetCaster()->CastCustomSpell(28375, SPELLVALUE_BASE_POINT0, damage, unitTarget); + cTarget->SetWalk(true); + cTarget->GetMotionMaster()->MoveFollow(GetCaster(), 0.0f, 0.0f, MOTION_SLOT_CONTROLLED); + cTarget->SetReactState(REACT_PASSIVE); + Unit::DealDamage(GetCaster(), cTarget, damage); + return; } + GetCaster()->CastCustomSpell(SPELL_DECIMATE_DAMAGE, SPELLVALUE_BASE_POINT0, damage, unitTarget); } + } - void Register() override - { - OnEffectHitTarget += SpellEffectFn(spell_gluth_decimate_SpellScript::HandleScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); - } - }; - - SpellScript* GetSpellScript() const override + void Register() override { - return new spell_gluth_decimate_SpellScript(); + OnEffectHitTarget += SpellEffectFn(spell_gluth_decimate::HandleScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); } }; void AddSC_boss_gluth() { new boss_gluth(); - new spell_gluth_decimate(); + RegisterSpellScript(spell_gluth_decimate); } diff --git a/src/server/scripts/Northrend/Naxxramas/boss_gothik.cpp b/src/server/scripts/Northrend/Naxxramas/boss_gothik.cpp index 43bc0090f..cc22c9234 100644 --- a/src/server/scripts/Northrend/Naxxramas/boss_gothik.cpp +++ b/src/server/scripts/Northrend/Naxxramas/boss_gothik.cpp @@ -688,29 +688,23 @@ public: }; }; -class spell_gothik_shadow_bolt_volley : public SpellScriptLoader +class spell_gothik_shadow_bolt_volley : public SpellScript { -public: - spell_gothik_shadow_bolt_volley() : SpellScriptLoader("spell_gothik_shadow_bolt_volley") { } + PrepareSpellScript(spell_gothik_shadow_bolt_volley); - class spell_gothik_shadow_bolt_volley_SpellScript : public SpellScript + bool Validate(SpellInfo const* /*spellInfo*/) override { - PrepareSpellScript(spell_gothik_shadow_bolt_volley_SpellScript); + return ValidateSpellInfo({ SPELL_SHADOW_MARK }); + } - void FilterTargets(std::list& targets) - { - targets.remove_if(Acore::UnitAuraCheck(false, SPELL_SHADOW_MARK)); - } - - void Register() override - { - OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_gothik_shadow_bolt_volley_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ENEMY); - } - }; - - SpellScript* GetSpellScript() const override + void FilterTargets(std::list& targets) { - return new spell_gothik_shadow_bolt_volley_SpellScript(); + targets.remove_if(Acore::UnitAuraCheck(false, SPELL_SHADOW_MARK)); + } + + void Register() override + { + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_gothik_shadow_bolt_volley::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ENEMY); } }; @@ -718,6 +712,6 @@ void AddSC_boss_gothik() { new boss_gothik(); new npc_boss_gothik_minion(); - new spell_gothik_shadow_bolt_volley(); + RegisterSpellScript(spell_gothik_shadow_bolt_volley); } diff --git a/src/server/scripts/Northrend/Naxxramas/boss_grobbulus.cpp b/src/server/scripts/Northrend/Naxxramas/boss_grobbulus.cpp index d0abfad0b..cd55faf04 100644 --- a/src/server/scripts/Northrend/Naxxramas/boss_grobbulus.cpp +++ b/src/server/scripts/Northrend/Naxxramas/boss_grobbulus.cpp @@ -240,91 +240,69 @@ public: }; }; -class spell_grobbulus_poison : public SpellScriptLoader +class spell_grobbulus_poison : public SpellScript { -public: - spell_grobbulus_poison() : SpellScriptLoader("spell_grobbulus_poison") { } + PrepareSpellScript(spell_grobbulus_poison); - class spell_grobbulus_poison_SpellScript : public SpellScript + void FilterTargets(std::list& targets) { - PrepareSpellScript(spell_grobbulus_poison_SpellScript); - - void FilterTargets(std::list& targets) + std::list tmplist; + for (auto& target : targets) { - std::list tmplist; - for (auto& target : targets) + if (GetCaster()->IsWithinDist3d(target, 0.0f)) { - if (GetCaster()->IsWithinDist3d(target, 0.0f)) - { - tmplist.push_back(target); - } - } - targets.clear(); - for (auto& itr : tmplist) - { - targets.push_back(itr); + tmplist.push_back(target); } } - - void Register() override + targets.clear(); + for (auto& itr : tmplist) { - OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_grobbulus_poison_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ENEMY); + targets.push_back(itr); } - }; + } - SpellScript* GetSpellScript() const override + void Register() override { - return new spell_grobbulus_poison_SpellScript(); + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_grobbulus_poison::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ENEMY); } }; -class spell_grobbulus_mutating_injection : public SpellScriptLoader +class spell_grobbulus_mutating_injection_aura : public AuraScript { - public: - spell_grobbulus_mutating_injection() : SpellScriptLoader("spell_grobbulus_mutating_injection") { } + PrepareAuraScript(spell_grobbulus_mutating_injection_aura); - class spell_grobbulus_mutating_injection_AuraScript : public AuraScript + bool Validate(SpellInfo const* /*spellInfo*/) override + { + return ValidateSpellInfo({ SPELL_MUTATING_EXPLOSION }); + } + + void HandleRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + { + switch (GetTargetApplication()->GetRemoveMode()) { - PrepareAuraScript(spell_grobbulus_mutating_injection_AuraScript); - - bool Validate(SpellInfo const* /*spellInfo*/) override - { - return ValidateSpellInfo({ SPELL_MUTATING_EXPLOSION }); - } - - void HandleRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - switch (GetTargetApplication()->GetRemoveMode()) + case AURA_REMOVE_BY_ENEMY_SPELL: + case AURA_REMOVE_BY_EXPIRE: + if (auto caster = GetCaster()) { - case AURA_REMOVE_BY_ENEMY_SPELL: - case AURA_REMOVE_BY_EXPIRE: - if (auto caster = GetCaster()) - { - caster->CastSpell(GetTarget(), SPELL_MUTATING_EXPLOSION, true); - } - break; - default: - return; + caster->CastSpell(GetTarget(), SPELL_MUTATING_EXPLOSION, true); } - } - - void Register() override - { - AfterEffectRemove += AuraEffectRemoveFn(spell_grobbulus_mutating_injection_AuraScript::HandleRemove, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); - } - }; - - AuraScript* GetAuraScript() const override - { - return new spell_grobbulus_mutating_injection_AuraScript(); + break; + default: + return; } + } + + void Register() override + { + AfterEffectRemove += AuraEffectRemoveFn(spell_grobbulus_mutating_injection_aura::HandleRemove, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); + } }; void AddSC_boss_grobbulus() { new boss_grobbulus(); new boss_grobbulus_poison_cloud(); - new spell_grobbulus_mutating_injection(); - new spell_grobbulus_poison(); + RegisterSpellScript(spell_grobbulus_mutating_injection_aura); + RegisterSpellScript(spell_grobbulus_poison); } diff --git a/src/server/scripts/Northrend/Naxxramas/boss_kelthuzad.cpp b/src/server/scripts/Northrend/Naxxramas/boss_kelthuzad.cpp index 4ec9cf976..9358c9877 100644 --- a/src/server/scripts/Northrend/Naxxramas/boss_kelthuzad.cpp +++ b/src/server/scripts/Northrend/Naxxramas/boss_kelthuzad.cpp @@ -665,82 +665,65 @@ public: }; }; -class spell_kelthuzad_frost_blast : public SpellScriptLoader +class spell_kelthuzad_frost_blast : public SpellScript { -public: - spell_kelthuzad_frost_blast() : SpellScriptLoader("spell_kelthuzad_frost_blast") { } + PrepareSpellScript(spell_kelthuzad_frost_blast); - class spell_kelthuzad_frost_blast_SpellScript : public SpellScript + bool Validate(SpellInfo const* /*spell*/) override { - PrepareSpellScript(spell_kelthuzad_frost_blast_SpellScript); + return ValidateSpellInfo({ SPELL_FROST_BLAST }); + } - void FilterTargets(std::list& targets) + void FilterTargets(std::list& targets) + { + Unit* caster = GetCaster(); + if (!caster || !caster->ToCreature()) + return; + + std::list tmplist; + for (auto& target : targets) { - Unit* caster = GetCaster(); - if (!caster || !caster->ToCreature()) - return; - - std::list tmplist; - for (auto& target : targets) + if (!target->ToUnit()->HasAura(SPELL_FROST_BLAST)) { - if (!target->ToUnit()->HasAura(SPELL_FROST_BLAST)) - { - tmplist.push_back(target); - } - } - targets.clear(); - for (auto& itr : tmplist) - { - targets.push_back(itr); + tmplist.push_back(target); } } - - void Register() override + targets.clear(); + for (auto& itr : tmplist) { - OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_kelthuzad_frost_blast_SpellScript::FilterTargets, EFFECT_ALL, TARGET_UNIT_DEST_AREA_ENEMY); + targets.push_back(itr); } - }; + } - SpellScript* GetSpellScript() const override + void Register() override { - return new spell_kelthuzad_frost_blast_SpellScript(); + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_kelthuzad_frost_blast::FilterTargets, EFFECT_ALL, TARGET_UNIT_DEST_AREA_ENEMY); } }; -class spell_kelthuzad_detonate_mana : public SpellScriptLoader +class spell_kelthuzad_detonate_mana_aura : public AuraScript { -public: - spell_kelthuzad_detonate_mana() : SpellScriptLoader("spell_kelthuzad_detonate_mana") { } + PrepareAuraScript(spell_kelthuzad_detonate_mana_aura); - class spell_kelthuzad_detonate_mana_AuraScript : public AuraScript + bool Validate(SpellInfo const* /*spell*/) override { - PrepareAuraScript(spell_kelthuzad_detonate_mana_AuraScript); + return ValidateSpellInfo({ SPELL_MANA_DETONATION_DAMAGE }); + } - bool Validate(SpellInfo const* /*spell*/) override - { - return ValidateSpellInfo({ SPELL_MANA_DETONATION_DAMAGE }); - } - - void HandleScript(AuraEffect const* aurEff) - { - PreventDefaultAction(); - Unit* target = GetTarget(); - if (auto mana = int32(target->GetMaxPower(POWER_MANA) / 10)) - { - mana = target->ModifyPower(POWER_MANA, -mana); - target->CastCustomSpell(SPELL_MANA_DETONATION_DAMAGE, SPELLVALUE_BASE_POINT0, -mana * 10, target, true, nullptr, aurEff); - } - } - - void Register() override - { - OnEffectPeriodic += AuraEffectPeriodicFn(spell_kelthuzad_detonate_mana_AuraScript::HandleScript, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL); - } - }; - - AuraScript* GetAuraScript() const override + void HandleScript(AuraEffect const* aurEff) { - return new spell_kelthuzad_detonate_mana_AuraScript(); + PreventDefaultAction(); + Unit* target = GetTarget(); + if (auto mana = int32(target->GetMaxPower(POWER_MANA) / 10)) + { + mana = target->ModifyPower(POWER_MANA, -mana); + target->CastCustomSpell(SPELL_MANA_DETONATION_DAMAGE, SPELLVALUE_BASE_POINT0, -mana * 10, target, true, nullptr, aurEff); + } + } + + void Register() override + { + OnEffectPeriodic += AuraEffectPeriodicFn(spell_kelthuzad_detonate_mana_aura::HandleScript, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL); } }; @@ -748,7 +731,7 @@ void AddSC_boss_kelthuzad() { new boss_kelthuzad(); new boss_kelthuzad_minion(); - new spell_kelthuzad_frost_blast(); - new spell_kelthuzad_detonate_mana(); + RegisterSpellScript(spell_kelthuzad_frost_blast); + RegisterSpellScript(spell_kelthuzad_detonate_mana_aura); } diff --git a/src/server/scripts/Northrend/Naxxramas/boss_sapphiron.cpp b/src/server/scripts/Northrend/Naxxramas/boss_sapphiron.cpp index 47cccd7e2..b2e6b4c5f 100644 --- a/src/server/scripts/Northrend/Naxxramas/boss_sapphiron.cpp +++ b/src/server/scripts/Northrend/Naxxramas/boss_sapphiron.cpp @@ -417,51 +417,40 @@ public: }; }; -class spell_sapphiron_frost_explosion : public SpellScriptLoader +class spell_sapphiron_frost_explosion : public SpellScript { -public: - spell_sapphiron_frost_explosion() : SpellScriptLoader("spell_sapphiron_frost_explosion") { } + PrepareSpellScript(spell_sapphiron_frost_explosion); - class spell_sapphiron_frost_explosion_SpellScript : public SpellScript + void FilterTargets(std::list& targets) { - PrepareSpellScript(spell_sapphiron_frost_explosion_SpellScript); + Unit* caster = GetCaster(); + if (!caster || !caster->ToCreature()) + return; - void FilterTargets(std::list& targets) + std::list tmplist; + for (auto& target : targets) { - Unit* caster = GetCaster(); - if (!caster || !caster->ToCreature()) - return; - - std::list tmplist; - for (auto& target : targets) + if (CAST_AI(boss_sapphiron::boss_sapphironAI, caster->ToCreature()->AI())->IsValidExplosionTarget(target)) { - if (CAST_AI(boss_sapphiron::boss_sapphironAI, caster->ToCreature()->AI())->IsValidExplosionTarget(target)) - { - tmplist.push_back(target); - } - } - targets.clear(); - for (auto& itr : tmplist) - { - targets.push_back(itr); + tmplist.push_back(target); } } - - void Register() override + targets.clear(); + for (auto& itr : tmplist) { - OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_sapphiron_frost_explosion_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_DEST_AREA_ENEMY); + targets.push_back(itr); } - }; + } - SpellScript* GetSpellScript() const override + void Register() override { - return new spell_sapphiron_frost_explosion_SpellScript(); + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_sapphiron_frost_explosion::FilterTargets, EFFECT_0, TARGET_UNIT_DEST_AREA_ENEMY); } }; void AddSC_boss_sapphiron() { new boss_sapphiron(); - new spell_sapphiron_frost_explosion(); + RegisterSpellScript(spell_sapphiron_frost_explosion); } diff --git a/src/server/scripts/Northrend/Naxxramas/boss_thaddius.cpp b/src/server/scripts/Northrend/Naxxramas/boss_thaddius.cpp index b2bf2a727..58ec8e4ce 100644 --- a/src/server/scripts/Northrend/Naxxramas/boss_thaddius.cpp +++ b/src/server/scripts/Northrend/Naxxramas/boss_thaddius.cpp @@ -606,121 +606,104 @@ public: }; }; -class spell_thaddius_pos_neg_charge : public SpellScriptLoader +class spell_thaddius_pos_neg_charge : public SpellScript { -public: - spell_thaddius_pos_neg_charge() : SpellScriptLoader("spell_thaddius_pos_neg_charge") { } + PrepareSpellScript(spell_thaddius_pos_neg_charge); - class spell_thaddius_pos_neg_charge_SpellScript : public SpellScript + bool Validate(SpellInfo const* /*spellInfo*/) override { - PrepareSpellScript(spell_thaddius_pos_neg_charge_SpellScript); + return ValidateSpellInfo({ SPELL_POSITIVE_CHARGE, SPELL_POSITIVE_CHARGE_STACK }); + } - void HandleTargets(std::list& targets) + void HandleTargets(std::list& targets) + { + uint8 count = 0; + for (auto& ihit : targets) { - uint8 count = 0; - for (auto& ihit : targets) + if (ihit->GetGUID() != GetCaster()->GetGUID()) { - if (ihit->GetGUID() != GetCaster()->GetGUID()) + if (Player* target = ihit->ToPlayer()) { - if (Player* target = ihit->ToPlayer()) + if (target->HasAura(GetTriggeringSpell()->Id)) { - if (target->HasAura(GetTriggeringSpell()->Id)) - { - ++count; - } + ++count; } } } - - if (count) - { - uint32 spellId = GetSpellInfo()->Id == SPELL_POSITIVE_CHARGE ? SPELL_POSITIVE_CHARGE_STACK : SPELL_NEGATIVE_CHARGE_STACK; - GetCaster()->SetAuraStack(spellId, GetCaster(), count); - } } - void HandleDamage(SpellEffIndex /*effIndex*/) + if (count) { - if (!GetTriggeringSpell()) - return; - - Unit* target = GetHitUnit(); - if (!target) - return; - - if (target->HasAura(GetTriggeringSpell()->Id) || target->GetTypeId() != TYPEID_PLAYER) - { - SetHitDamage(0); - } - else if (target->GetInstanceScript()) - { - target->GetInstanceScript()->SetData(DATA_CHARGES_CROSSED, 0); - } + uint32 spellId = GetSpellInfo()->Id == SPELL_POSITIVE_CHARGE ? SPELL_POSITIVE_CHARGE_STACK : SPELL_NEGATIVE_CHARGE_STACK; + GetCaster()->SetAuraStack(spellId, GetCaster(), count); } + } - void Register() override - { - OnEffectHitTarget += SpellEffectFn(spell_thaddius_pos_neg_charge_SpellScript::HandleDamage, EFFECT_0, SPELL_EFFECT_SCHOOL_DAMAGE); - OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_thaddius_pos_neg_charge_SpellScript::HandleTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ALLY); - } - }; - - SpellScript* GetSpellScript() const override + void HandleDamage(SpellEffIndex /*effIndex*/) { - return new spell_thaddius_pos_neg_charge_SpellScript(); + if (!GetTriggeringSpell()) + return; + + Unit* target = GetHitUnit(); + if (!target) + return; + + if (target->HasAura(GetTriggeringSpell()->Id) || target->GetTypeId() != TYPEID_PLAYER) + { + SetHitDamage(0); + } + else if (target->GetInstanceScript()) + { + target->GetInstanceScript()->SetData(DATA_CHARGES_CROSSED, 0); + } + } + + void Register() override + { + OnEffectHitTarget += SpellEffectFn(spell_thaddius_pos_neg_charge::HandleDamage, EFFECT_0, SPELL_EFFECT_SCHOOL_DAMAGE); + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_thaddius_pos_neg_charge::HandleTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ALLY); } }; -class spell_thaddius_polarity_shift : public SpellScriptLoader +class spell_thaddius_polarity_shift : public SpellScript { -public: - spell_thaddius_polarity_shift() : SpellScriptLoader("spell_thaddius_polarity_shift") { } + PrepareSpellScript(spell_thaddius_polarity_shift); - class spell_thaddius_polarity_shift_SpellScript : public SpellScript + bool Validate(SpellInfo const* /*spell*/) override { - PrepareSpellScript(spell_thaddius_polarity_shift_SpellScript); + return ValidateSpellInfo({ SPELL_POSITIVE_POLARITY, SPELL_NEGATIVE_POLARITY }); + } - bool Validate(SpellInfo const* /*spell*/) override + void HandleDummy(SpellEffIndex /* effIndex */) + { + Unit* caster = GetCaster(); + if (Unit* target = GetHitUnit()) { - return ValidateSpellInfo({ SPELL_POSITIVE_POLARITY, SPELL_NEGATIVE_POLARITY }); + target->RemoveAurasDueToSpell(SPELL_POSITIVE_CHARGE_STACK); + target->RemoveAurasDueToSpell(SPELL_NEGATIVE_CHARGE_STACK); + target->CastSpell(target, roll_chance_i(50) ? SPELL_POSITIVE_POLARITY : SPELL_NEGATIVE_POLARITY, true, nullptr, nullptr, caster->GetGUID()); } + } - void HandleDummy(SpellEffIndex /* effIndex */) + void HandleAfterCast() + { + if (GetCaster()) { - Unit* caster = GetCaster(); - if (Unit* target = GetHitUnit()) + if (Creature* caster = GetCaster()->ToCreature()) { - target->RemoveAurasDueToSpell(SPELL_POSITIVE_CHARGE_STACK); - target->RemoveAurasDueToSpell(SPELL_NEGATIVE_CHARGE_STACK); - target->CastSpell(target, roll_chance_i(50) ? SPELL_POSITIVE_POLARITY : SPELL_NEGATIVE_POLARITY, true, nullptr, nullptr, caster->GetGUID()); - } - } - - void HandleAfterCast() - { - if (GetCaster()) - { - if (Creature* caster = GetCaster()->ToCreature()) + if (caster->GetEntry() == NPC_THADDIUS) { - if (caster->GetEntry() == NPC_THADDIUS) - { - caster->AI()->Talk(SAY_ELECT); - caster->AI()->Talk(EMOTE_POLARITY_SHIFTED); - } + caster->AI()->Talk(SAY_ELECT); + caster->AI()->Talk(EMOTE_POLARITY_SHIFTED); } } } + } - void Register() override - { - OnEffectHitTarget += SpellEffectFn(spell_thaddius_polarity_shift_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); - AfterCast += SpellCastFn(spell_thaddius_polarity_shift_SpellScript::HandleAfterCast); - } - }; - - SpellScript* GetSpellScript() const override + void Register() override { - return new spell_thaddius_polarity_shift_SpellScript(); + OnEffectHitTarget += SpellEffectFn(spell_thaddius_polarity_shift::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); + AfterCast += SpellCastFn(spell_thaddius_polarity_shift::HandleAfterCast); } }; @@ -771,7 +754,7 @@ void AddSC_boss_thaddius() new boss_thaddius(); new boss_thaddius_summon(); new npc_tesla(); - new spell_thaddius_pos_neg_charge(); - new spell_thaddius_polarity_shift(); + RegisterSpellScript(spell_thaddius_pos_neg_charge); + RegisterSpellScript(spell_thaddius_polarity_shift); new at_thaddius_entrance(); }