From 299631f3b561fb63eb9aab8619663a20f76643fc Mon Sep 17 00:00:00 2001 From: Benjamin Jackson <38561765+heyitsbench@users.noreply.github.com> Date: Sat, 8 Jun 2024 15:03:53 -0400 Subject: [PATCH 01/11] fix(DB/Creature): Correct model info for Hyjal bosses. (#19032) * Init. * Remove comments. Bad CI. --- data/sql/updates/pending_db_world/hyjal-models.sql | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 data/sql/updates/pending_db_world/hyjal-models.sql diff --git a/data/sql/updates/pending_db_world/hyjal-models.sql b/data/sql/updates/pending_db_world/hyjal-models.sql new file mode 100644 index 0000000000..b249c4ba1c --- /dev/null +++ b/data/sql/updates/pending_db_world/hyjal-models.sql @@ -0,0 +1,3 @@ +UPDATE `creature_model_info` SET `BoundingRadius` = 4.5, `CombatReach` = 7.875 WHERE `DisplayID` = 17886; +UPDATE `creature_model_info` SET `BoundingRadius` = 4.2 WHERE `DisplayID` = 20939; +UPDATE `creature_model_info` SET `BoundingRadius` = 5, `CombatReach` = 7.5 WHERE `DisplayID` = 21069; From d77b3ac110d03c57459affc5ea81aa7fad1fab59 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Sat, 8 Jun 2024 19:04:44 +0000 Subject: [PATCH 02/11] chore(DB): import pending files Referenced commit(s): 299631f3b561fb63eb9aab8619663a20f76643fc --- .../hyjal-models.sql => db_world/2024_06_08_02.sql} | 1 + 1 file changed, 1 insertion(+) rename data/sql/updates/{pending_db_world/hyjal-models.sql => db_world/2024_06_08_02.sql} (86%) diff --git a/data/sql/updates/pending_db_world/hyjal-models.sql b/data/sql/updates/db_world/2024_06_08_02.sql similarity index 86% rename from data/sql/updates/pending_db_world/hyjal-models.sql rename to data/sql/updates/db_world/2024_06_08_02.sql index b249c4ba1c..0aea159ffb 100644 --- a/data/sql/updates/pending_db_world/hyjal-models.sql +++ b/data/sql/updates/db_world/2024_06_08_02.sql @@ -1,3 +1,4 @@ +-- DB update 2024_06_08_01 -> 2024_06_08_02 UPDATE `creature_model_info` SET `BoundingRadius` = 4.5, `CombatReach` = 7.875 WHERE `DisplayID` = 17886; UPDATE `creature_model_info` SET `BoundingRadius` = 4.2 WHERE `DisplayID` = 20939; UPDATE `creature_model_info` SET `BoundingRadius` = 5, `CombatReach` = 7.5 WHERE `DisplayID` = 21069; From 415f52d66263c3b3207e3dff925e8e5ffc643ad3 Mon Sep 17 00:00:00 2001 From: Jelle Meeus Date: Sun, 9 Jun 2024 13:39:16 +0200 Subject: [PATCH 03/11] refactor(Scripts/Naxxramas): Spell Scripts use registry macros (#19034) * ktz frost blast * ktz detonate mana * thaddius pos_neg_charge * thaddius polarity shift * sapph frost explosion * grobbulus poison * grobbulus mutating injection * gothik shadow bolt volley * gluth decimate * horsemen mark * add sql * trigger ci * Revert "trigger ci" This reverts commit d8b18d5c5c37d12da1deab0be50941bfe96641a6. * add validate horsemen mark * add validate gluth decimate * add validate gothik shadow mark * add validate ktz frost blast * add validate thaddius pos_neg_charge --- .../rev_1717886186186050826.sql | 4 + .../Naxxramas/boss_four_horsemen.cpp | 84 +++++----- .../Northrend/Naxxramas/boss_gluth.cpp | 53 +++---- .../Northrend/Naxxramas/boss_gothik.cpp | 32 ++-- .../Northrend/Naxxramas/boss_grobbulus.cpp | 98 +++++------- .../Northrend/Naxxramas/boss_kelthuzad.cpp | 99 +++++------- .../Northrend/Naxxramas/boss_sapphiron.cpp | 45 ++---- .../Northrend/Naxxramas/boss_thaddius.cpp | 147 ++++++++---------- 8 files changed, 241 insertions(+), 321 deletions(-) create mode 100644 data/sql/updates/pending_db_world/rev_1717886186186050826.sql 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 0000000000..c6fc9ff7c8 --- /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 c3bd17fa17..9da029cf3f 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 9f98655d04..9fddd3647c 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 43bc0090f0..cc22c92341 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 d0abfad0b0..cd55faf043 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 4ec9cf9762..9358c9877b 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 47cccd7e2c..b2e6b4c5f8 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 b2bf2a7273..58ec8e4ce9 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(); } From f48219f30b7af793e4a87788d7c6e25a582abb39 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Sun, 9 Jun 2024 11:40:10 +0000 Subject: [PATCH 04/11] chore(DB): import pending files Referenced commit(s): 415f52d66263c3b3207e3dff925e8e5ffc643ad3 --- .../rev_1717886186186050826.sql => db_world/2024_06_09_00.sql} | 1 + 1 file changed, 1 insertion(+) rename data/sql/updates/{pending_db_world/rev_1717886186186050826.sql => db_world/2024_06_09_00.sql} (88%) diff --git a/data/sql/updates/pending_db_world/rev_1717886186186050826.sql b/data/sql/updates/db_world/2024_06_09_00.sql similarity index 88% rename from data/sql/updates/pending_db_world/rev_1717886186186050826.sql rename to data/sql/updates/db_world/2024_06_09_00.sql index c6fc9ff7c8..bdf42eaaa5 100644 --- a/data/sql/updates/pending_db_world/rev_1717886186186050826.sql +++ b/data/sql/updates/db_world/2024_06_09_00.sql @@ -1,3 +1,4 @@ +-- DB update 2024_06_08_02 -> 2024_06_09_00 -- 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; From 82d5a42402d9ce9f3babd91014644f6a97d2738e Mon Sep 17 00:00:00 2001 From: Walter Pagani Date: Sun, 9 Jun 2024 08:45:17 -0300 Subject: [PATCH 05/11] chore(Command/unstuck) use command with offline players (#18913) Co-authored-by: Andrew <47818697+Nyeriah@users.noreply.github.com> Co-authored-by: Anton Popovichenko --- .../Implementation/CharacterDatabase.cpp | 2 +- src/server/scripts/Commands/cs_misc.cpp | 21 ++++++++++++++++++- 2 files changed, 21 insertions(+), 2 deletions(-) diff --git a/src/server/database/Database/Implementation/CharacterDatabase.cpp b/src/server/database/Database/Implementation/CharacterDatabase.cpp index c3794fef4c..eaa1ffc10f 100644 --- a/src/server/database/Database/Implementation/CharacterDatabase.cpp +++ b/src/server/database/Database/Implementation/CharacterDatabase.cpp @@ -95,7 +95,7 @@ void CharacterDatabaseConnection::DoPrepareStatements() PrepareStatement(CHAR_SEL_MAIL_SERVER_CHARACTER, "SELECT mailId from mail_server_character WHERE guid = ? and mailId = ?", CONNECTION_ASYNC); PrepareStatement(CHAR_REP_MAIL_SERVER_CHARACTER, "REPLACE INTO mail_server_character (guid, mailId) values (?, ?)", CONNECTION_ASYNC); PrepareStatement(CHAR_SEL_CHARACTER_SOCIALLIST, "SELECT friend, flags, note FROM character_social JOIN characters ON characters.guid = character_social.friend WHERE character_social.guid = ? AND deleteinfos_name IS NULL LIMIT 255", CONNECTION_ASYNC); - PrepareStatement(CHAR_SEL_CHARACTER_HOMEBIND, "SELECT mapId, zoneId, posX, posY, posZ, posO FROM character_homebind WHERE guid = ?", CONNECTION_ASYNC); + PrepareStatement(CHAR_SEL_CHARACTER_HOMEBIND, "SELECT mapId, zoneId, posX, posY, posZ, posO FROM character_homebind WHERE guid = ?", CONNECTION_BOTH); PrepareStatement(CHAR_SEL_CHARACTER_SPELLCOOLDOWNS, "SELECT spell, category, item, time, needSend FROM character_spell_cooldown WHERE guid = ?", CONNECTION_ASYNC); PrepareStatement(CHAR_SEL_CHARACTER_DECLINEDNAMES, "SELECT genitive, dative, accusative, instrumental, prepositional FROM character_declinedname WHERE guid = ?", CONNECTION_ASYNC); PrepareStatement(CHAR_SEL_CHARACTER_ACHIEVEMENTS, "SELECT achievement, date FROM character_achievement WHERE guid = ?", CONNECTION_ASYNC); diff --git a/src/server/scripts/Commands/cs_misc.cpp b/src/server/scripts/Commands/cs_misc.cpp index 0dc93612ca..14cac42ad4 100644 --- a/src/server/scripts/Commands/cs_misc.cpp +++ b/src/server/scripts/Commands/cs_misc.cpp @@ -1386,7 +1386,26 @@ public: if (!target || !target->IsConnected()) { - return false; + if (handler->HasLowerSecurity(nullptr, target->GetGUID())) + return false; + + CharacterDatabasePreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_CHARACTER_HOMEBIND); + stmt->SetData(0, target->GetGUID().GetCounter()); + + PreparedQueryResult result = CharacterDatabase.Query(stmt); + + if (result) + { + Field* fieldsDB = result->Fetch(); + WorldLocation loc(fieldsDB[0].Get(), fieldsDB[2].Get(), fieldsDB[3].Get(), fieldsDB[4].Get(), 0.0f); + uint32 zoneId = fieldsDB[1].Get(); + + Player::SavePositionInDB(loc, zoneId, target->GetGUID(), nullptr); + + handler->PSendSysMessage(LANG_SUMMONING, target->GetName(), handler->GetAcoreString(LANG_OFFLINE)); + } + + return true; } Player* player = target->GetConnectedPlayer(); From afd8cfef9486205472f7ac7c01d081e2d83e3305 Mon Sep 17 00:00:00 2001 From: Andrew <47818697+Nyeriah@users.noreply.github.com> Date: Sun, 9 Jun 2024 17:31:27 -0300 Subject: [PATCH 06/11] fix(DB/SAI): Subdue the Subduer should credit group (#19036) --- data/sql/updates/pending_db_world/rev_1717964255204489800.sql | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 data/sql/updates/pending_db_world/rev_1717964255204489800.sql diff --git a/data/sql/updates/pending_db_world/rev_1717964255204489800.sql b/data/sql/updates/pending_db_world/rev_1717964255204489800.sql new file mode 100644 index 0000000000..7953a4b107 --- /dev/null +++ b/data/sql/updates/pending_db_world/rev_1717964255204489800.sql @@ -0,0 +1,4 @@ +-- +DELETE FROM `smart_scripts` WHERE (`entryorguid` = 22357) AND (`source_type` = 0) AND (`id` IN (2)); +INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `event_param5`, `event_param6`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_param4`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES +(22357, 0, 2, 0, 6, 0, 100, 512, 0, 0, 0, 0, 0, 0, 26, 11090, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 'Reth\'hedron the Subduer - On Just Died - Quest Credit \'Subdue the Subduer\''); From 8a988fd10a1adba402cb6db45d7385c81ff606f9 Mon Sep 17 00:00:00 2001 From: Dan <83884799+elthehablo@users.noreply.github.com> Date: Sun, 9 Jun 2024 22:32:16 +0200 Subject: [PATCH 07/11] fix(Scripts/Hyjal): Air Burst back to random target (#19037) init --- .../CavernsOfTime/BattleForMountHyjal/boss_archimonde.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_archimonde.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_archimonde.cpp index 4ea6dc4838..21e6d1c1e4 100644 --- a/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_archimonde.cpp +++ b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_archimonde.cpp @@ -295,7 +295,7 @@ struct boss_archimonde : public BossAI { scheduler.DelayGroup(GROUP_FEAR, 5s); Talk(SAY_AIR_BURST); - DoCastAOE(SPELL_AIR_BURST); + DoCastRandomTarget(SPELL_AIR_BURST); }, 25s, 40s); ScheduleTimedEvent(25s, 35s, [&] { From 24b4975320893caa6bef175517adebfd05a26d7b Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Sun, 9 Jun 2024 20:32:18 +0000 Subject: [PATCH 08/11] chore(DB): import pending files Referenced commit(s): afd8cfef9486205472f7ac7c01d081e2d83e3305 --- .../rev_1717964255204489800.sql => db_world/2024_06_09_01.sql} | 1 + 1 file changed, 1 insertion(+) rename data/sql/updates/{pending_db_world/rev_1717964255204489800.sql => db_world/2024_06_09_01.sql} (94%) diff --git a/data/sql/updates/pending_db_world/rev_1717964255204489800.sql b/data/sql/updates/db_world/2024_06_09_01.sql similarity index 94% rename from data/sql/updates/pending_db_world/rev_1717964255204489800.sql rename to data/sql/updates/db_world/2024_06_09_01.sql index 7953a4b107..9a1f1eb2de 100644 --- a/data/sql/updates/pending_db_world/rev_1717964255204489800.sql +++ b/data/sql/updates/db_world/2024_06_09_01.sql @@ -1,3 +1,4 @@ +-- DB update 2024_06_09_00 -> 2024_06_09_01 -- DELETE FROM `smart_scripts` WHERE (`entryorguid` = 22357) AND (`source_type` = 0) AND (`id` IN (2)); INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `event_param5`, `event_param6`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_param4`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES From 289758094ce9d4a457d25f0f42e0b4a855dd7888 Mon Sep 17 00:00:00 2001 From: Andrew <47818697+Nyeriah@users.noreply.github.com> Date: Sun, 9 Jun 2024 17:32:29 -0300 Subject: [PATCH 09/11] chore(Scripts/Hyjal): Clean up redundancy (#19035) --- .../CavernsOfTime/BattleForMountHyjal/hyjal.h | 2 + .../BattleForMountHyjal/instance_hyjal.cpp | 126 +++++++----------- 2 files changed, 47 insertions(+), 81 deletions(-) diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjal.h b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjal.h index 4f2493e7cb..8575d7e354 100644 --- a/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjal.h +++ b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjal.h @@ -90,6 +90,7 @@ enum HyjalCreaturesIds NPC_ALLIANCE_RIFLEMAN = 17921, NPC_ALLIANCE_PRIEST = 17928, NPC_ALLIANCE_SORCERESS = 17922, + NPC_GUARDIAN_ELEMENTAL = 18001, // Horde Base NPC_THRALL = 17852, @@ -102,6 +103,7 @@ enum HyjalCreaturesIds NPC_HORDE_PEON = 17937, NPC_INFERNAL_RELAY = 18242, NPC_INFERNAL_TARGET = 21075, + NPC_DIRE_WOLF = 17854, // Night Elf Base NPC_TYRANDE = 17948, diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/instance_hyjal.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/instance_hyjal.cpp index 2589d70675..76749ed625 100644 --- a/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/instance_hyjal.cpp +++ b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/instance_hyjal.cpp @@ -51,11 +51,6 @@ ObjectData const creatureData[] = { 0, 0 } }; -ObjectData const objectData[] = -{ - { 0, 0 } -}; - Milliseconds hyjalWaveTimers[4][MAX_WAVES_STANDARD] { { 130000ms, 130000ms, 130000ms, 130000ms, 130000ms, 130000ms, 130000ms, 190000ms, 0ms }, // Winterchill @@ -92,7 +87,7 @@ public: SetHeaders(DataHeader); SetBossNumber(EncounterCount); LoadDoorData(doorData); - LoadObjectData(creatureData, objectData); + LoadObjectData(creatureData, nullptr); } void Initialize() override @@ -203,6 +198,8 @@ public: break; case NPC_TOWERING_INFERNAL: case NPC_LESSER_DOOMGUARD: + case NPC_DIRE_WOLF: + case NPC_GUARDIAN_ELEMENTAL: if (creature->IsSummon()) { _summonedNPCs.insert(creature->GetGUID()); @@ -243,6 +240,8 @@ public: break; case NPC_TOWERING_INFERNAL: case NPC_LESSER_DOOMGUARD: + case NPC_DIRE_WOLF: + case NPC_GUARDIAN_ELEMENTAL: _summonedNPCs.erase(creature->GetGUID()); break; case NPC_WINTERCHILL: @@ -250,9 +249,9 @@ public: case NPC_KAZROGAL: case NPC_AZGALOR: if (Creature* jaina = GetCreature(DATA_JAINA)) - jaina->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP); + jaina->SetNpcFlag(UNIT_NPC_FLAG_GOSSIP); if (Creature* thrall = GetCreature(DATA_THRALL)) - thrall->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP); + thrall->SetNpcFlag(UNIT_NPC_FLAG_GOSSIP); SetData(DATA_RESET_WAVES, 1); break; } @@ -290,14 +289,14 @@ public: } // Despawn all alliance NPCs - _scheduler.Schedule(21000ms, [this](TaskContext) + scheduler.Schedule(21000ms, [this](TaskContext) { for (ObjectGuid const& guid : _baseAlliance) if (Creature* creature = instance->GetCreature(guid)) creature->DespawnOrUnsummon(); // Spawn Roaring Flame after a delay - _scheduler.Schedule(30s, [this](TaskContext) + scheduler.Schedule(30s, [this](TaskContext) { for (ObjectGuid const& guid : _roaringFlameAlliance) { @@ -338,13 +337,13 @@ public: } } - _scheduler.Schedule(21000ms, [this](TaskContext) + scheduler.Schedule(21000ms, [this](TaskContext) { for (ObjectGuid const& guid : _baseHorde) if (Creature* creature = instance->GetCreature(guid)) creature->DespawnOrUnsummon(); - _scheduler.Schedule(30s, [this](TaskContext) + scheduler.Schedule(30s, [this](TaskContext) { for (ObjectGuid const& guid : _roaringFlameHorde) if (GameObject* flame = instance->GetGameObject(guid)) @@ -399,6 +398,10 @@ public: _bossWave = DATA_ARCHIMONDE; ScheduleWaves(1ms, START_WAVE_NIGHT_ELF, MAX_WAVES_NIGHT_ELF, hyjalNightElfWaveTimers[0]); } + + if (_bossWave) + DoUpdateWorldState(WORLD_STATE_WAVES, 0); + break; case DATA_SPAWN_INFERNALS: { @@ -419,84 +422,46 @@ public: } } break; - case DATA_RESET_ALLIANCE: - for (ObjectGuid const& guid : _baseAlliance) - if (Creature* creature = instance->GetCreature(guid)) - creature->DespawnOrUnsummon(); - - for (ObjectGuid const& guid : _encounterNPCs) - if (Creature* creature = instance->GetCreature(guid)) - creature->DespawnOrUnsummon(); - - // also force despawn boss summons - for (ObjectGuid const& guid : _summonedNPCs) - if (Creature* creature = instance->GetCreature(guid)) - creature->DespawnOrUnsummon(); - - if (_bossWave && (GetBossState(_bossWave) != DONE)) - SetBossState(_bossWave, NOT_STARTED); - - _scheduler.Schedule(300s, [this](TaskContext) - { - for (ObjectGuid const& guid : _baseAlliance) - if (Creature* creature = instance->GetCreature(guid)) - creature->Respawn(); - }); - - SetData(DATA_RESET_WAVES, 0); - break; - case DATA_RESET_HORDE: - for (ObjectGuid const& guid : _baseHorde) - if (Creature* creature = instance->GetCreature(guid)) - creature->DespawnOrUnsummon(); - - for (ObjectGuid const& guid : _encounterNPCs) - if (Creature* creature = instance->GetCreature(guid)) - creature->DespawnOrUnsummon(); - - // also force despawn boss summons - for (ObjectGuid const& guid : _summonedNPCs) - if (Creature* creature = instance->GetCreature(guid)) - creature->DespawnOrUnsummon(); - - if (_bossWave && (GetBossState(_bossWave) != DONE)) - SetBossState(_bossWave, NOT_STARTED); - - _scheduler.Schedule(300s, [this](TaskContext) - { - for (ObjectGuid const& guid : _baseHorde) - if (Creature* creature = instance->GetCreature(guid)) - creature->Respawn(); - }); - - SetData(DATA_RESET_WAVES, 0); - break; case DATA_RESET_NIGHT_ELF: + if (Creature* archimonde = GetCreature(DATA_ARCHIMONDE)) + archimonde->DespawnOrUnsummon(0s, 300s); + [[fallthrough]]; + case DATA_RESET_ALLIANCE: + case DATA_RESET_HORDE: + if (GetBossState(DATA_ANETHERON) != DONE) + { + for (ObjectGuid const& guid : _baseAlliance) + if (Creature* creature = instance->GetCreature(guid)) + creature->DespawnOrUnsummon(0s, 300s); + } + + if (GetBossState(DATA_AZGALOR) != DONE) + { + for (ObjectGuid const& guid : _baseHorde) + if (Creature* creature = instance->GetCreature(guid)) + creature->DespawnOrUnsummon(0s, 300s); + } + for (ObjectGuid const& guid : _baseNightElf) if (Creature* creature = instance->GetCreature(guid)) - creature->DespawnOrUnsummon(); + creature->DespawnOrUnsummon(0s, 300s); for (ObjectGuid const& guid : _encounterNPCs) if (Creature* creature = instance->GetCreature(guid)) creature->DespawnOrUnsummon(); - if (Creature* archimonde = GetCreature(DATA_ARCHIMONDE)) - archimonde->DespawnOrUnsummon(); + // also force despawn boss summons + for (ObjectGuid const& guid : _summonedNPCs) + if (Creature* creature = instance->GetCreature(guid)) + creature->DespawnOrUnsummon(); - _scheduler.Schedule(300s, [this](TaskContext) - { - for (ObjectGuid const& guid : _baseNightElf) - if (Creature* creature = instance->GetCreature(guid)) - creature->Respawn(); - - if (Creature* archi = GetCreature(DATA_ARCHIMONDE)) - archi->Respawn(); - }); + if (_bossWave && (GetBossState(_bossWave) != DONE)) + SetBossState(_bossWave, NOT_STARTED); SetData(DATA_RESET_WAVES, 0); break; case DATA_RESET_WAVES: - _scheduler.CancelGroup(CONTEXT_GROUP_WAVES); + scheduler.CancelGroup(CONTEXT_GROUP_WAVES); _encounterNPCs.clear(); _summonedNPCs.clear(); _currentWave = 0; @@ -533,10 +498,10 @@ public: void ScheduleWaves(Milliseconds /* time */, uint8 startWaves, uint8 maxWaves, Milliseconds timerptr[]) { // No overlapping! - _scheduler.CancelGroup(CONTEXT_GROUP_WAVES); + scheduler.CancelGroup(CONTEXT_GROUP_WAVES); trash = 0; // Reset counter here to avoid resetting the counter from scheduled waves. Required because creatures killed for RP events counts towards the kill counter as well, confirmed in Retail. - _scheduler.Schedule(1ms, [this, startWaves, maxWaves, timerptr](TaskContext context) + scheduler.Schedule(1ms, [this, startWaves, maxWaves, timerptr](TaskContext context) { // If all waves reached, cancel scheduling new ones if (_currentWave >= maxWaves) @@ -572,7 +537,7 @@ public: void Update(uint32 diff) override { - _scheduler.Update(diff); + scheduler.Update(diff); } void OnPlayerInWaterStateUpdate(Player* player, bool inWater) override @@ -588,7 +553,6 @@ public: uint8 _currentWave; uint8 _bossWave; uint8 _retreat; - TaskScheduler _scheduler; GuidSet _encounterNPCs; GuidSet _summonedNPCs; GuidSet _baseAlliance; From 6250936c6a5d8e0608a6af1563b7e2f66643ce87 Mon Sep 17 00:00:00 2001 From: Andrew <47818697+Nyeriah@users.noreply.github.com> Date: Sun, 9 Jun 2024 17:32:43 -0300 Subject: [PATCH 10/11] fix(DB/SAI): Watoosun Polluted Essence shouldnt cast Acid Splash (#19038) --- data/sql/updates/pending_db_world/rev_1717965047865056400.sql | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 data/sql/updates/pending_db_world/rev_1717965047865056400.sql diff --git a/data/sql/updates/pending_db_world/rev_1717965047865056400.sql b/data/sql/updates/pending_db_world/rev_1717965047865056400.sql new file mode 100644 index 0000000000..402b8cf282 --- /dev/null +++ b/data/sql/updates/pending_db_world/rev_1717965047865056400.sql @@ -0,0 +1,4 @@ +-- +UPDATE `creature_template` SET `AIName` = '' WHERE `entry` = 18145; + +DELETE FROM `smart_scripts` WHERE (`entryorguid` = 18145) AND (`source_type` = 0); From 12b187e6e5cb94c03b4e5d64142672616d4e4c3c Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Sun, 9 Jun 2024 20:33:10 +0000 Subject: [PATCH 11/11] chore(DB): import pending files Referenced commit(s): 8a988fd10a1adba402cb6db45d7385c81ff606f9 --- .../rev_1717965047865056400.sql => db_world/2024_06_09_02.sql} | 1 + 1 file changed, 1 insertion(+) rename data/sql/updates/{pending_db_world/rev_1717965047865056400.sql => db_world/2024_06_09_02.sql} (77%) diff --git a/data/sql/updates/pending_db_world/rev_1717965047865056400.sql b/data/sql/updates/db_world/2024_06_09_02.sql similarity index 77% rename from data/sql/updates/pending_db_world/rev_1717965047865056400.sql rename to data/sql/updates/db_world/2024_06_09_02.sql index 402b8cf282..f854f30ddc 100644 --- a/data/sql/updates/pending_db_world/rev_1717965047865056400.sql +++ b/data/sql/updates/db_world/2024_06_09_02.sql @@ -1,3 +1,4 @@ +-- DB update 2024_06_09_01 -> 2024_06_09_02 -- UPDATE `creature_template` SET `AIName` = '' WHERE `entry` = 18145;