From 3e791dfcbdbf88dabb1bf660a9be6ce083c0b18e Mon Sep 17 00:00:00 2001 From: blinkysc <37940565+blinkysc@users.noreply.github.com> Date: Fri, 20 Feb 2026 16:56:22 -0600 Subject: [PATCH 001/150] fix(DB/Spell): Add spell_proc entry for Inner Focus (#24780) --- .../updates/pending_db_world/rev_1771623224005229683.sql | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 data/sql/updates/pending_db_world/rev_1771623224005229683.sql diff --git a/data/sql/updates/pending_db_world/rev_1771623224005229683.sql b/data/sql/updates/pending_db_world/rev_1771623224005229683.sql new file mode 100644 index 000000000..a51e0ea71 --- /dev/null +++ b/data/sql/updates/pending_db_world/rev_1771623224005229683.sql @@ -0,0 +1,8 @@ +-- Inner Focus (14751) - Add spell_proc entry with PROC_ATTR_REQ_SPELLMOD +-- Without this, the proc system consumes the charge on the spell's own cast +-- because Inner Focus's SpellFamilyFlags overlap with its EffectSpellClassMask. +-- PROC_ATTR_REQ_SPELLMOD (0x8) ensures charges are only consumed when the +-- modifier is actually applied to the triggering spell. +DELETE FROM `spell_proc` WHERE `SpellId` = 14751; +INSERT INTO `spell_proc` (`SpellId`,`SchoolMask`,`SpellFamilyName`,`SpellFamilyMask0`,`SpellFamilyMask1`,`SpellFamilyMask2`,`ProcFlags`,`SpellTypeMask`,`SpellPhaseMask`,`HitMask`,`AttributesMask`,`DisableEffectsMask`,`ProcsPerMinute`,`Chance`,`Cooldown`,`Charges`) VALUES +(14751, 0, 6, 3755474943, 14521847, 8256, 0, 7, 2, 0, 8, 0, 0, 0, 0, 0); From 8459cff6cece6fe4f118ceef2b6550da5825fb0c Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Fri, 20 Feb 2026 22:57:32 +0000 Subject: [PATCH 002/150] chore(DB): import pending files Referenced commit(s): 3e791dfcbdbf88dabb1bf660a9be6ce083c0b18e --- .../rev_1771623224005229683.sql => db_world/2026_02_20_07.sql} | 1 + 1 file changed, 1 insertion(+) rename data/sql/updates/{pending_db_world/rev_1771623224005229683.sql => db_world/2026_02_20_07.sql} (94%) diff --git a/data/sql/updates/pending_db_world/rev_1771623224005229683.sql b/data/sql/updates/db_world/2026_02_20_07.sql similarity index 94% rename from data/sql/updates/pending_db_world/rev_1771623224005229683.sql rename to data/sql/updates/db_world/2026_02_20_07.sql index a51e0ea71..1255086d7 100644 --- a/data/sql/updates/pending_db_world/rev_1771623224005229683.sql +++ b/data/sql/updates/db_world/2026_02_20_07.sql @@ -1,3 +1,4 @@ +-- DB update 2026_02_20_06 -> 2026_02_20_07 -- Inner Focus (14751) - Add spell_proc entry with PROC_ATTR_REQ_SPELLMOD -- Without this, the proc system consumes the charge on the spell's own cast -- because Inner Focus's SpellFamilyFlags overlap with its EffectSpellClassMask. From 5e1fd50776fc1b1908a58a6db900ee9d1d48aa7f Mon Sep 17 00:00:00 2001 From: blinkysc <37940565+blinkysc@users.noreply.github.com> Date: Fri, 20 Feb 2026 18:48:08 -0600 Subject: [PATCH 003/150] fix(Core/Scripts): Prevent Judgement of Light from triggering Beacon of Light (#24781) Co-authored-by: blinkysc --- src/server/scripts/Spells/spell_paladin.cpp | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/server/scripts/Spells/spell_paladin.cpp b/src/server/scripts/Spells/spell_paladin.cpp index 89a3a571a..d9c228867 100644 --- a/src/server/scripts/Spells/spell_paladin.cpp +++ b/src/server/scripts/Spells/spell_paladin.cpp @@ -2218,12 +2218,18 @@ class spell_pal_light_s_beacon : public AuraScript SPELL_PALADIN_BEACON_OF_LIGHT_AURA, SPELL_PALADIN_BEACON_OF_LIGHT_FLASH, SPELL_PALADIN_BEACON_OF_LIGHT_HOLY, - SPELL_PALADIN_HOLY_LIGHT_R1 + SPELL_PALADIN_HOLY_LIGHT_R1, + SPELL_PALADIN_JUDGEMENT_OF_LIGHT_HEAL }); } bool CheckProc(ProcEventInfo& eventInfo) { + // Don't proc from Judgement of Light heals — JoL sets originalCaster to + // the paladin for combat log, but the heal is actually cast by the attacker. + if (eventInfo.GetSpellInfo() && eventInfo.GetSpellInfo()->Id == SPELL_PALADIN_JUDGEMENT_OF_LIGHT_HEAL) + return false; + // Don't proc if the heal target is the beacon target (no double heal) if (GetTarget()->HasAura(SPELL_PALADIN_BEACON_OF_LIGHT_AURA, eventInfo.GetActor()->GetGUID())) return false; From b01e202244e69d09bfb6523d83e19db5574660e3 Mon Sep 17 00:00:00 2001 From: blinkysc <37940565+blinkysc@users.noreply.github.com> Date: Fri, 20 Feb 2026 18:48:23 -0600 Subject: [PATCH 004/150] fix(Core/Spells): Fix Avenging Wrath not greying out Divine Protection/Shield (#24778) Co-authored-by: blinkysc --- src/server/game/Spells/Spell.cpp | 4 ++++ src/server/scripts/Spells/spell_paladin.cpp | 7 ++----- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/src/server/game/Spells/Spell.cpp b/src/server/game/Spells/Spell.cpp index 856eafe78..e8fe0a346 100644 --- a/src/server/game/Spells/Spell.cpp +++ b/src/server/game/Spells/Spell.cpp @@ -3201,6 +3201,10 @@ void Spell::DoTriggersOnSpellHit(Unit* unit, uint8 effMask) /// @todo: move this code to scripts if (m_preCastSpell) { + // Avenging Wrath - also apply Immune Shield Marker + if (m_preCastSpell == 61987) + m_caster->CastSpell(unit, 61988, true); + // Fearie Fire (Feral) - damage if (m_preCastSpell == 60089) m_caster->CastSpell(unit, m_preCastSpell, true); diff --git a/src/server/scripts/Spells/spell_paladin.cpp b/src/server/scripts/Spells/spell_paladin.cpp index d9c228867..a57be2921 100644 --- a/src/server/scripts/Spells/spell_paladin.cpp +++ b/src/server/scripts/Spells/spell_paladin.cpp @@ -556,18 +556,15 @@ class spell_pal_avenging_wrath : public AuraScript }); } - void HandleApply(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/) + void HandleApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) { Unit* target = GetTarget(); + if (AuraEffect const* sanctifiedWrathAurEff = target->GetAuraEffectOfRankedSpell(SPELL_PALADIN_SANCTIFIED_WRATH_TALENT_R1, EFFECT_2)) { int32 basepoints = sanctifiedWrathAurEff->GetAmount(); target->CastCustomSpell(target, SPELL_PALADIN_SANCTIFIED_WRATH, &basepoints, &basepoints, nullptr, true, nullptr, sanctifiedWrathAurEff); } - - target->CastSpell(target, SPELL_PALADIN_AVENGING_WRATH_MARKER, true, nullptr, aurEff); - // Blizz seems to just apply aura without bothering to cast - target->AddAura(SPELL_PALADIN_IMMUNE_SHIELD_MARKER, target); } void HandleRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) From 4e233cc4aee34434282c882b5adca4925ad56d6b Mon Sep 17 00:00:00 2001 From: sogladev Date: Sat, 21 Feb 2026 13:06:25 +0100 Subject: [PATCH 005/150] fix(Scripts/Spells): Mad Alchemist's Potion and Gluth's Decimate 10m (#24788) Co-authored-by: Gerhood --- .../rev_1771670602673698356.sql | 6 + src/server/scripts/Spells/spell_item.cpp | 110 ++++++++++-------- 2 files changed, 68 insertions(+), 48 deletions(-) create mode 100644 data/sql/updates/pending_db_world/rev_1771670602673698356.sql diff --git a/data/sql/updates/pending_db_world/rev_1771670602673698356.sql b/data/sql/updates/pending_db_world/rev_1771670602673698356.sql new file mode 100644 index 000000000..f2d99f9c5 --- /dev/null +++ b/data/sql/updates/pending_db_world/rev_1771670602673698356.sql @@ -0,0 +1,6 @@ +-- +UPDATE `spell_script_names` SET `ScriptName` = 'spell_gluth_decimate' WHERE `spell_id` = 28374 AND `ScriptName` = 'spell_item_mad_alchemists_potion'; + +DELETE FROM `spell_script_names` WHERE `spell_id` = 45051; +INSERT INTO `spell_script_names` (`spell_id`, `ScriptName`) VALUES +(45051, 'spell_item_mad_alchemists_potion'); diff --git a/src/server/scripts/Spells/spell_item.cpp b/src/server/scripts/Spells/spell_item.cpp index f2d237eda..b0a801b6e 100644 --- a/src/server/scripts/Spells/spell_item.cpp +++ b/src/server/scripts/Spells/spell_item.cpp @@ -772,32 +772,6 @@ class spell_item_essence_of_life : public AuraScript } }; -const uint32 crazyAlchemistTable[5] = -{ - 53909, // Wild Magic - 53908, // Potion of Speed - 53762, // Indestructible Potion - 43185, // Runic Healing Potion - 43186 // Runic Mana Potion -}; - -class spell_item_crazy_alchemists_potion : public SpellScript -{ - PrepareSpellScript(spell_item_crazy_alchemists_potion); - - void HandleHeal(SpellEffIndex /*effIndex*/) - { - // Xinef: 20% to get additional effect, guessed - if (roll_chance_i(20)) - GetCaster()->CastSpell(GetCaster(), crazyAlchemistTable[urand(0, (GetCaster()->getPowerType() == POWER_MANA ? 4 : 3))], true); - } - - void Register() override - { - OnEffectHitTarget += SpellEffectFn(spell_item_crazy_alchemists_potion::HandleHeal, EFFECT_0, SPELL_EFFECT_HEAL); - } -}; - class spell_item_skull_of_impeding_doom : public AuraScript { PrepareAuraScript(spell_item_skull_of_impeding_doom); @@ -5071,7 +5045,7 @@ class spell_item_darkmoon_card_illusion : public AuraScript } }; -// 28374 - Mad Alchemist's Potion +// 45051 - Mad Alchemist's Potion (34440) class spell_item_mad_alchemists_potion : public SpellScript { PrepareSpellScript(spell_item_mad_alchemists_potion); @@ -5081,32 +5055,32 @@ class spell_item_mad_alchemists_potion : public SpellScript std::vector availableElixirs = { // Battle Elixirs - 33720, // Onslaught Elixir - 54452, // Adept's Elixir - 33726, // Elixir of Mastery - 28490, // Elixir of Major Strength - 28491, // Elixir of Healing Power - 28493, // Elixir of Major Frost Power - 54494, // Elixir of Major Agility - 28501, // Elixir of Major Firepower - 28503, // Elixir of Major Shadow Power - 38954, // Fel Strength Elixir + 33720, // Onslaught Elixir (28102) + 54452, // Adept's Elixir (28103) + 33726, // Elixir of Mastery (28104) + 28490, // Elixir of Major Strength (22824) + 28491, // Elixir of Healing Power (22825) + 28493, // Elixir of Major Frost Power (22827) + 54494, // Elixir of Major Agility (22831) + 28501, // Elixir of Major Firepower (22833) + 28503, // Elixir of Major Shadow Power (22835) + 38954, // Fel Strength Elixir (31679) // Guardian Elixirs - 39625, // Elixir of Major Fortitude - 39626, // Earthen Elixir - 39627, // Elixir of Draenic Wisdom - 39628, // Elixir of Ironskin - 28502, // Elixir of Major Defense - 28514, // Elixir of Empowerment + 39625, // Elixir of Major Fortitude (32062) + 39626, // Earthen Elixir (32063) + 39627, // Elixir of Draenic Wisdom (32067) + 39628, // Elixir of Ironskin (32068) + 28502, // Elixir of Major Defense (22834) + 28514, // Elixir of Empowerment (22848) // Other - 28489, // Elixir of Camouflage - 28496 // Elixir of the Searching Eye + 28489, // Elixir of Camouflage (22823) + 28496 // Elixir of the Searching Eye (22830) }; Unit* target = GetCaster(); if (target->getPowerType() == POWER_MANA) - availableElixirs.push_back(28509); // Elixir of Major Mageblood + availableElixirs.push_back(28509); // Elixir of Major Mageblood (22840) uint32 chosenElixir = Acore::Containers::SelectRandomContainerElement(availableElixirs); @@ -5117,7 +5091,7 @@ class spell_item_mad_alchemists_potion : public SpellScript chosenSpellGroup = SPELL_GROUP_ELIXIR_BATTLE; if (sSpellMgr->IsSpellMemberOfSpellGroup(chosenElixir, SPELL_GROUP_ELIXIR_GUARDIAN)) chosenSpellGroup = SPELL_GROUP_ELIXIR_GUARDIAN; - + // If another spell of the same group is already active the elixir should not be cast if (chosenSpellGroup != SPELL_GROUP_NONE) { Unit::AuraApplicationMap const& auraMap = target->GetAppliedAuras(); @@ -5142,6 +5116,46 @@ class spell_item_mad_alchemists_potion : public SpellScript } }; +// 53750 - Crazy Alchemist's Potion (40077) +class spell_item_crazy_alchemists_potion : public SpellScript +{ + PrepareSpellScript(spell_item_crazy_alchemists_potion); + + void SecondaryEffect() + { + std::vector availableElixirs = + { + 43185, // Runic Healing Potion (33447) + 53750, // Crazy Alchemist's Potion (40077) + 53761, // Powerful Rejuvenation Potion (40087) + 53762, // Indestructible Potion (40093) + 53908, // Potion of Speed (40211) + 53909, // Potion of Wild Magic (40212) + 53910, // Mighty Arcane Protection Potion (40213) + 53911, // Mighty Fire Protection Potion (40214) + 53913, // Mighty Frost Protection Potion (40215) + 53914, // Mighty Nature Protection Potion (40216) + 53915 // Mighty Shadow Protection Potion (40217) + }; + + Unit* target = GetCaster(); + + if (!target->IsInCombat()) + availableElixirs.push_back(53753); // Potion of Nightmares (40081) + if (target->getPowerType() == POWER_MANA) + availableElixirs.push_back(43186); // Runic Mana Potion (33448) + + uint32 chosenElixir = Acore::Containers::SelectRandomContainerElement(availableElixirs); + + target->CastSpell(target, chosenElixir, GetCastItem()); + } + + void Register() override + { + AfterCast += SpellCastFn(spell_item_crazy_alchemists_potion::SecondaryEffect); + } +}; + // 47770 - Roll 'dem Bones class spell_item_decahedral_dwarven_dice : public SpellScript { @@ -6209,7 +6223,6 @@ void AddSC_item_spell_scripts() RegisterSpellScript(spell_item_toxic_wasteling); RegisterSpellScript(spell_item_lil_xt); RegisterSpellScript(spell_item_essence_of_life); - RegisterSpellScript(spell_item_crazy_alchemists_potion); RegisterSpellScript(spell_item_skull_of_impeding_doom); RegisterSpellScript(spell_item_feast); RegisterSpellScript(spell_item_gnomish_universal_remote); @@ -6341,6 +6354,7 @@ void AddSC_item_spell_scripts() RegisterSpellScript(spell_item_drums_of_the_wild); RegisterSpellScript(spell_item_darkmoon_card_illusion); RegisterSpellScript(spell_item_mad_alchemists_potion); + RegisterSpellScript(spell_item_crazy_alchemists_potion); RegisterSpellScript(spell_item_decahedral_dwarven_dice); RegisterSpellScript(spell_item_aura_of_madness); RegisterSpellScript(spell_item_dementia); From 85071c01cc6933fcfec66644bf1fcfaa68b69246 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Sat, 21 Feb 2026 12:07:31 +0000 Subject: [PATCH 006/150] chore(DB): import pending files Referenced commit(s): 4e233cc4aee34434282c882b5adca4925ad56d6b --- .../rev_1771670602673698356.sql => db_world/2026_02_21_00.sql} | 1 + 1 file changed, 1 insertion(+) rename data/sql/updates/{pending_db_world/rev_1771670602673698356.sql => db_world/2026_02_21_00.sql} (88%) diff --git a/data/sql/updates/pending_db_world/rev_1771670602673698356.sql b/data/sql/updates/db_world/2026_02_21_00.sql similarity index 88% rename from data/sql/updates/pending_db_world/rev_1771670602673698356.sql rename to data/sql/updates/db_world/2026_02_21_00.sql index f2d99f9c5..180e90739 100644 --- a/data/sql/updates/pending_db_world/rev_1771670602673698356.sql +++ b/data/sql/updates/db_world/2026_02_21_00.sql @@ -1,3 +1,4 @@ +-- DB update 2026_02_20_07 -> 2026_02_21_00 -- UPDATE `spell_script_names` SET `ScriptName` = 'spell_gluth_decimate' WHERE `spell_id` = 28374 AND `ScriptName` = 'spell_item_mad_alchemists_potion'; From 69bccd0a5689bc2ee2eaa89b6c4cb1002670df1a Mon Sep 17 00:00:00 2001 From: blinkysc <37940565+blinkysc@users.noreply.github.com> Date: Sat, 21 Feb 2026 08:12:52 -0600 Subject: [PATCH 007/150] fix(Core/Scripts): Allow Lock and Load to proc from fire school traps (#24784) Co-authored-by: blinkysc --- src/server/scripts/Spells/spell_hunter.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/server/scripts/Spells/spell_hunter.cpp b/src/server/scripts/Spells/spell_hunter.cpp index 52537630a..860415bcf 100644 --- a/src/server/scripts/Spells/spell_hunter.cpp +++ b/src/server/scripts/Spells/spell_hunter.cpp @@ -1193,9 +1193,8 @@ class spell_hun_lock_and_load : public AuraScript if (!(eventInfo.GetTypeMask() & PROC_FLAG_DONE_TRAP_ACTIVATION)) return false; - // Do not proc on traps for immolation/explosive trap SpellInfo const* spellInfo = eventInfo.GetSpellInfo(); - if (!spellInfo || !(spellInfo->GetSchoolMask() & SPELL_SCHOOL_MASK_FROST)) + if (!spellInfo || !(spellInfo->GetSchoolMask() & (SPELL_SCHOOL_MASK_FROST | SPELL_SCHOOL_MASK_FIRE))) return false; return roll_chance_i(aurEff->GetAmount()); From 16fd29c78f9d458866e6ce7d72596f78fe917c26 Mon Sep 17 00:00:00 2001 From: blinkysc <37940565+blinkysc@users.noreply.github.com> Date: Sat, 21 Feb 2026 08:30:53 -0600 Subject: [PATCH 008/150] fix(DB/Spell): Fix Omen of Clarity not proccing from utility spells (#24783) Co-authored-by: blinkysc --- .../rev_11390035128862920444.sql | 2 ++ src/server/scripts/Spells/spell_druid.cpp | 20 ++++--------------- 2 files changed, 6 insertions(+), 16 deletions(-) create mode 100644 data/sql/updates/pending_db_world/rev_11390035128862920444.sql diff --git a/data/sql/updates/pending_db_world/rev_11390035128862920444.sql b/data/sql/updates/pending_db_world/rev_11390035128862920444.sql new file mode 100644 index 000000000..34421f28b --- /dev/null +++ b/data/sql/updates/pending_db_world/rev_11390035128862920444.sql @@ -0,0 +1,2 @@ +-- Omen of Clarity: revert SpellTypeMask to 0 to match TrinityCore +UPDATE `spell_proc` SET `SpellTypeMask` = 0 WHERE `SpellId` = 16864; diff --git a/src/server/scripts/Spells/spell_druid.cpp b/src/server/scripts/Spells/spell_druid.cpp index 8a677ff57..2bac18112 100644 --- a/src/server/scripts/Spells/spell_druid.cpp +++ b/src/server/scripts/Spells/spell_druid.cpp @@ -238,44 +238,32 @@ class spell_dru_omen_of_clarity : public AuraScript { SpellInfo const* spellInfo = eventInfo.GetSpellInfo(); if (!spellInfo) - { return true; - } - // Prevent passive spells to proc. (I.e shapeshift passives & passive talents) if (spellInfo->IsPassive()) - { return false; - } - // Don't proc on crafting items. if (spellInfo->HasEffect(SPELL_EFFECT_CREATE_ITEM)) - { return false; - } + + // Reject energize spells (e.g. Furor) - they are not real casts + if (spellInfo->HasEffect(SPELL_EFFECT_ENERGIZE)) + return false; if (eventInfo.GetTypeMask() & PROC_FLAG_DONE_SPELL_MELEE_DMG_CLASS) - { return spellInfo->HasAttribute(SPELL_ATTR0_ON_NEXT_SWING) || spellInfo->HasAttribute(SPELL_ATTR0_ON_NEXT_SWING_NO_DAMAGE); - } // Non-damaged/Non-healing spells - only druid abilities if (!spellInfo->HasAttribute(SpellCustomAttributes(SPELL_ATTR0_CU_DIRECT_DAMAGE | SPELL_ATTR0_CU_NO_INITIAL_THREAT))) { if (spellInfo->SpellFamilyName == SPELLFAMILY_DRUID) - { - // Exclude shapeshifting return !spellInfo->HasAura(SPELL_AURA_MOD_SHAPESHIFT); - } return false; } - // Revitalize if (spellInfo->SpellIconID == SPELL_ICON_REVITALIZE) - { return false; - } return true; } From 33bafc7c8a73c9e99f75bd2656c55ed0a4ba3192 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Sat, 21 Feb 2026 14:31:56 +0000 Subject: [PATCH 009/150] chore(DB): import pending files Referenced commit(s): 16fd29c78f9d458866e6ce7d72596f78fe917c26 --- .../rev_11390035128862920444.sql => db_world/2026_02_21_01.sql} | 1 + 1 file changed, 1 insertion(+) rename data/sql/updates/{pending_db_world/rev_11390035128862920444.sql => db_world/2026_02_21_01.sql} (75%) diff --git a/data/sql/updates/pending_db_world/rev_11390035128862920444.sql b/data/sql/updates/db_world/2026_02_21_01.sql similarity index 75% rename from data/sql/updates/pending_db_world/rev_11390035128862920444.sql rename to data/sql/updates/db_world/2026_02_21_01.sql index 34421f28b..e4baba8b5 100644 --- a/data/sql/updates/pending_db_world/rev_11390035128862920444.sql +++ b/data/sql/updates/db_world/2026_02_21_01.sql @@ -1,2 +1,3 @@ +-- DB update 2026_02_21_00 -> 2026_02_21_01 -- Omen of Clarity: revert SpellTypeMask to 0 to match TrinityCore UPDATE `spell_proc` SET `SpellTypeMask` = 0 WHERE `SpellId` = 16864; From 1c91f96e0203572a3568ecbecadfb3790f53d190 Mon Sep 17 00:00:00 2001 From: blinkysc <37940565+blinkysc@users.noreply.github.com> Date: Sat, 21 Feb 2026 10:42:09 -0600 Subject: [PATCH 010/150] fix(DB/Spells): Fix Soul Preserver trinket proccing from non-healing spells (#24792) Co-authored-by: blinkysc --- data/sql/updates/pending_db_world/rev_1771685416037009585.sql | 1 + 1 file changed, 1 insertion(+) create mode 100644 data/sql/updates/pending_db_world/rev_1771685416037009585.sql diff --git a/data/sql/updates/pending_db_world/rev_1771685416037009585.sql b/data/sql/updates/pending_db_world/rev_1771685416037009585.sql new file mode 100644 index 000000000..f9dfbb9dc --- /dev/null +++ b/data/sql/updates/pending_db_world/rev_1771685416037009585.sql @@ -0,0 +1 @@ +UPDATE `spell_proc` SET `SpellTypeMask` = 2 WHERE `SpellId` = 60510; From 07e9cef70fdba57878b04f8dc2b23bb66f96d6fe Mon Sep 17 00:00:00 2001 From: blinkysc <37940565+blinkysc@users.noreply.github.com> Date: Sat, 21 Feb 2026 10:42:27 -0600 Subject: [PATCH 011/150] fix(Scripts/Spells): Remove duplicate Sacred Shield script with wrong caster attribution (#24791) Co-authored-by: blinkysc --- .../rev_1771684443067867140.sql | 1 + src/server/scripts/Spells/spell_paladin.cpp | 101 ------------------ 2 files changed, 1 insertion(+), 101 deletions(-) create mode 100644 data/sql/updates/pending_db_world/rev_1771684443067867140.sql diff --git a/data/sql/updates/pending_db_world/rev_1771684443067867140.sql b/data/sql/updates/pending_db_world/rev_1771684443067867140.sql new file mode 100644 index 000000000..94cb8b822 --- /dev/null +++ b/data/sql/updates/pending_db_world/rev_1771684443067867140.sql @@ -0,0 +1 @@ +DELETE FROM `spell_script_names` WHERE `ScriptName` = 'spell_pal_sacred_shield_base'; diff --git a/src/server/scripts/Spells/spell_paladin.cpp b/src/server/scripts/Spells/spell_paladin.cpp index a57be2921..163899a46 100644 --- a/src/server/scripts/Spells/spell_paladin.cpp +++ b/src/server/scripts/Spells/spell_paladin.cpp @@ -288,106 +288,6 @@ class spell_pal_sacred_shield : public AuraScript } }; -class spell_pal_sacred_shield_base : public AuraScript -{ - PrepareAuraScript(spell_pal_sacred_shield_base); - - static constexpr uint32 SACRED_SHIELD_ICD = 6 * IN_MILLISECONDS; - uint32 _cooldownEnd = 0; - - void CalculateAmount(AuraEffect const* aurEff, int32& amount, bool& /*canBeRecalculated*/) - { - if (Unit* caster = GetCaster()) - { - SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(GetSpellInfo()->Effects[aurEff->GetEffIndex()].TriggerSpell); - amount = spellInfo->Effects[EFFECT_0].CalcValue(); - - // +75.00% from sp bonus - amount += CalculatePct(caster->SpellBaseDamageBonusDone(spellInfo->GetSchoolMask()), 75.0f); - - // Xinef: removed divine guardian because it will affect triggered spell with increased amount - // Arena - Dampening - if (AuraEffect const* dampening = caster->GetAuraEffect(SPELL_GENERIC_ARENA_DAMPENING, EFFECT_0)) - { - AddPct(amount, dampening->GetAmount()); - } - // Battleground - Dampening - else if (AuraEffect const* dampening2 = caster->GetAuraEffect(SPELL_GENERIC_BATTLEGROUND_DAMPENING, EFFECT_0)) - { - AddPct(amount, dampening2->GetAmount()); - } - } - } - - bool CheckProc(ProcEventInfo& eventInfo) - { - HealInfo* healinfo = eventInfo.GetHealInfo(); - DamageInfo* damageinfo = eventInfo.GetDamageInfo(); - return !(eventInfo.GetHitMask() & PROC_EX_INTERNAL_HOT) && ((healinfo && healinfo->GetHeal() > 0) || (damageinfo && damageinfo->GetDamage() > 0)); - } - - void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) - { - PreventDefaultAction(); - - if (eventInfo.GetTypeMask() & PROC_FLAG_TAKEN_SPELL_MAGIC_DMG_CLASS_POS) - { - Unit* caster = eventInfo.GetActor(); - - HealInfo* healinfo = eventInfo.GetHealInfo(); - - if (!healinfo || !healinfo->GetHeal()) - { - return; - } - - SpellInfo const* procSpell = healinfo->GetSpellInfo(); - if (!procSpell) - { - return; - } - - if (caster && procSpell->SpellFamilyName == SPELLFAMILY_PALADIN && - procSpell->SpellFamilyFlags.HasFlag(0x40000000) && caster->GetAuraEffect(SPELL_AURA_PROC_TRIGGER_SPELL, SPELLFAMILY_PALADIN, 3021, 0)) // need infusion of light - { - int32 basepoints = int32(float(healinfo->GetHeal()) / 12.0f); - // Item - Paladin T9 Holy 4P Bonus (Flash of Light) - if (AuraEffect const* aurEffect = caster->GetAuraEffect(67191, EFFECT_0)) - AddPct(basepoints, aurEffect->GetAmount()); - - caster->CastCustomSpell(eventInfo.GetActionTarget(), 66922, &basepoints, nullptr, nullptr, true, nullptr, aurEff, caster->GetGUID()); - return; - } - - return; - } - - uint32 now = GameTime::GetGameTimeMS().count(); - if (_cooldownEnd > now) - return; - - uint32 cooldown = SACRED_SHIELD_ICD; - - // Item - Paladin T8 Holy 4P Bonus - if (Unit* caster = aurEff->GetCaster()) - if (AuraEffect const* aurEffect = caster->GetAuraEffect(64895, 0)) - cooldown = aurEffect->GetAmount() * IN_MILLISECONDS; - - _cooldownEnd = now + cooldown; - - uint32 triggered_spell_id = GetSpellInfo()->Effects[aurEff->GetEffIndex()].TriggerSpell; - int32 basepoints = aurEff->GetAmount(); - eventInfo.GetActionTarget()->CastCustomSpell(eventInfo.GetActionTarget(), triggered_spell_id, &basepoints, nullptr, nullptr, true, nullptr, aurEff, eventInfo.GetActionTarget()->GetGUID()); - } - - void Register() override - { - DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_pal_sacred_shield_base::CalculateAmount, EFFECT_0, SPELL_AURA_DUMMY); - DoCheckProc += AuraCheckProcFn(spell_pal_sacred_shield_base::CheckProc); - OnEffectProc += AuraEffectProcFn(spell_pal_sacred_shield_base::HandleProc, EFFECT_0, SPELL_AURA_DUMMY); - } -}; - // 31850 - Ardent Defender class spell_pal_ardent_defender : public AuraScript { @@ -2271,7 +2171,6 @@ void AddSC_paladin_spell_scripts() RegisterSpellScript(spell_pal_divine_purpose); RegisterSpellScript(spell_pal_seal_of_light); RegisterSpellScript(spell_pal_sacred_shield); - RegisterSpellScript(spell_pal_sacred_shield_base); RegisterSpellScript(spell_pal_ardent_defender); RegisterSpellScript(spell_pal_aura_mastery); RegisterSpellScript(spell_pal_aura_mastery_immune); From f7bc41eebec9c214df71adef292f1387a61e76c6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Francesco=20Borz=C3=AC?= Date: Sat, 21 Feb 2026 17:42:52 +0100 Subject: [PATCH 012/150] refactor(Core/Entities): clean up vendor item removal and add QuaternionData Euler helpers (#24790) --- src/server/game/Entities/Creature/Creature.cpp | 2 +- src/server/game/Entities/GameObject/GameObject.cpp | 11 +++++++++++ src/server/game/Entities/GameObject/GameObjectData.h | 2 ++ 3 files changed, 14 insertions(+), 1 deletion(-) diff --git a/src/server/game/Entities/Creature/Creature.cpp b/src/server/game/Entities/Creature/Creature.cpp index dd2ab4992..694c19287 100644 --- a/src/server/game/Entities/Creature/Creature.cpp +++ b/src/server/game/Entities/Creature/Creature.cpp @@ -88,7 +88,7 @@ bool VendorItemData::RemoveItem(uint32 item_id) { if ((*i)->item == item_id) { - i = m_items.erase(i++); + i = m_items.erase(i); found = true; } else diff --git a/src/server/game/Entities/GameObject/GameObject.cpp b/src/server/game/Entities/GameObject/GameObject.cpp index 7979eeb21..32e450030 100644 --- a/src/server/game/Entities/GameObject/GameObject.cpp +++ b/src/server/game/Entities/GameObject/GameObject.cpp @@ -43,6 +43,17 @@ bool QuaternionData::IsUnit() const return fabs(x * x + y * y + z * z + w * w - 1.0f) < 1e-5f; } +void QuaternionData::ToEulerAnglesZYX(float& Z, float& Y, float& X) const +{ + G3D::Matrix3(G3D::Quat(x, y, z, w)).toEulerAnglesZYX(Z, Y, X); +} + +QuaternionData QuaternionData::FromEulerAnglesZYX(float Z, float Y, float X) +{ + G3D::Quat quat(G3D::Matrix3::fromEulerAnglesZYX(Z, Y, X)); + return QuaternionData(quat.x, quat.y, quat.z, quat.w); +} + GameObject::GameObject() : WorldObject(), MovableMapObject(), m_model(nullptr), m_goValue(), m_AI(nullptr) { diff --git a/src/server/game/Entities/GameObject/GameObjectData.h b/src/server/game/Entities/GameObject/GameObjectData.h index eafe70a9d..39c1a6e28 100644 --- a/src/server/game/Entities/GameObject/GameObjectData.h +++ b/src/server/game/Entities/GameObject/GameObjectData.h @@ -689,6 +689,8 @@ struct AC_GAME_API QuaternionData QuaternionData(float X, float Y, float Z, float W) : x(X), y(Y), z(Z), w(W) { } [[nodiscard]] bool IsUnit() const; + void ToEulerAnglesZYX(float& Z, float& Y, float& X) const; + [[nodiscard]] static QuaternionData FromEulerAnglesZYX(float Z, float Y, float X); }; // `gameobject_addon` table From 34caea42becabe0c6f1f31142ee970ec75ac1e47 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Sat, 21 Feb 2026 16:43:14 +0000 Subject: [PATCH 013/150] chore(DB): import pending files Referenced commit(s): 1c91f96e0203572a3568ecbecadfb3790f53d190 --- .../rev_1771684443067867140.sql => db_world/2026_02_21_02.sql} | 1 + .../rev_1771685416037009585.sql => db_world/2026_02_21_03.sql} | 1 + 2 files changed, 2 insertions(+) rename data/sql/updates/{pending_db_world/rev_1771684443067867140.sql => db_world/2026_02_21_02.sql} (66%) rename data/sql/updates/{pending_db_world/rev_1771685416037009585.sql => db_world/2026_02_21_03.sql} (61%) diff --git a/data/sql/updates/pending_db_world/rev_1771684443067867140.sql b/data/sql/updates/db_world/2026_02_21_02.sql similarity index 66% rename from data/sql/updates/pending_db_world/rev_1771684443067867140.sql rename to data/sql/updates/db_world/2026_02_21_02.sql index 94cb8b822..c410c64b3 100644 --- a/data/sql/updates/pending_db_world/rev_1771684443067867140.sql +++ b/data/sql/updates/db_world/2026_02_21_02.sql @@ -1 +1,2 @@ +-- DB update 2026_02_21_01 -> 2026_02_21_02 DELETE FROM `spell_script_names` WHERE `ScriptName` = 'spell_pal_sacred_shield_base'; diff --git a/data/sql/updates/pending_db_world/rev_1771685416037009585.sql b/data/sql/updates/db_world/2026_02_21_03.sql similarity index 61% rename from data/sql/updates/pending_db_world/rev_1771685416037009585.sql rename to data/sql/updates/db_world/2026_02_21_03.sql index f9dfbb9dc..c0aaa436a 100644 --- a/data/sql/updates/pending_db_world/rev_1771685416037009585.sql +++ b/data/sql/updates/db_world/2026_02_21_03.sql @@ -1 +1,2 @@ +-- DB update 2026_02_21_02 -> 2026_02_21_03 UPDATE `spell_proc` SET `SpellTypeMask` = 2 WHERE `SpellId` = 60510; From 052c36224abea362a816edf2196a6e7388258018 Mon Sep 17 00:00:00 2001 From: blinkysc <37940565+blinkysc@users.noreply.github.com> Date: Sat, 21 Feb 2026 16:01:10 -0600 Subject: [PATCH 014/150] fix(Core/Spells): Port HandleBreakableCCAuraProc from TrinityCore (#24793) Co-authored-by: blinkysc Co-authored-by: joschiwald Co-authored-by: sogladev --- .../game/Spells/Auras/SpellAuraEffects.cpp | 18 + .../game/Spells/Auras/SpellAuraEffects.h | 1 + src/server/game/Spells/SpellMgr.cpp | 1 + .../game/Spells/BreakableCCProcTest.cpp | 369 ++++++++++++++++++ 4 files changed, 389 insertions(+) create mode 100644 src/test/server/game/Spells/BreakableCCProcTest.cpp diff --git a/src/server/game/Spells/Auras/SpellAuraEffects.cpp b/src/server/game/Spells/Auras/SpellAuraEffects.cpp index 43f9b3adc..ef713a32d 100644 --- a/src/server/game/Spells/Auras/SpellAuraEffects.cpp +++ b/src/server/game/Spells/Auras/SpellAuraEffects.cpp @@ -1254,6 +1254,14 @@ void AuraEffect::HandleProc(AuraApplication* aurApp, ProcEventInfo& eventInfo) switch (GetAuraType()) { + case SPELL_AURA_MOD_CONFUSE: + case SPELL_AURA_MOD_FEAR: + case SPELL_AURA_MOD_STUN: + case SPELL_AURA_MOD_ROOT: + case SPELL_AURA_TRANSFORM: + HandleBreakableCCAuraProc(aurApp, eventInfo); + break; + case SPELL_AURA_DUMMY: case SPELL_AURA_PROC_TRIGGER_SPELL: HandleProcTriggerSpellAuraProc(aurApp, eventInfo); break; @@ -7214,6 +7222,16 @@ void AuraEffect::HandlePeriodicPowerBurnAuraTick(Unit* target, Unit* caster) con Unit::ProcSkillsAndAuras(caster, damageInfo.target, procAttacker, procVictim, hitMask, damageInfo.damage, BASE_ATTACK, spellProto, nullptr, GetEffIndex(), nullptr, &dmgInfo); } +void AuraEffect::HandleBreakableCCAuraProc(AuraApplication* aurApp, ProcEventInfo& eventInfo) +{ + int32 const damageLeft = GetAmount() - static_cast(eventInfo.GetDamageInfo()->GetDamage()); + + if (damageLeft <= 0) + aurApp->GetTarget()->RemoveAura(aurApp); + else + SetAmount(damageLeft); +} + void AuraEffect::HandleProcTriggerSpellAuraProc(AuraApplication* aurApp, ProcEventInfo& eventInfo) { Unit* triggerCaster = aurApp->GetTarget(); diff --git a/src/server/game/Spells/Auras/SpellAuraEffects.h b/src/server/game/Spells/Auras/SpellAuraEffects.h index 937195060..960ded1dd 100644 --- a/src/server/game/Spells/Auras/SpellAuraEffects.h +++ b/src/server/game/Spells/Auras/SpellAuraEffects.h @@ -334,6 +334,7 @@ public: void HandlePeriodicPowerBurnAuraTick(Unit* target, Unit* caster) const; // aura effect proc handlers + void HandleBreakableCCAuraProc(AuraApplication* aurApp, ProcEventInfo& eventInfo); void HandleProcTriggerSpellAuraProc(AuraApplication* aurApp, ProcEventInfo& eventInfo); void HandleProcTriggerSpellWithValueAuraProc(AuraApplication* aurApp, ProcEventInfo& eventInfo); void HandleProcTriggerDamageAuraProc(AuraApplication* aurApp, ProcEventInfo& eventInfo); diff --git a/src/server/game/Spells/SpellMgr.cpp b/src/server/game/Spells/SpellMgr.cpp index c18449ec4..4374d9d77 100644 --- a/src/server/game/Spells/SpellMgr.cpp +++ b/src/server/game/Spells/SpellMgr.cpp @@ -1822,6 +1822,7 @@ bool InitTriggerAuraData() isTriggerAura[SPELL_AURA_ABILITY_IGNORE_AURASTATE] = true; isAlwaysTriggeredAura[SPELL_AURA_OVERRIDE_CLASS_SCRIPTS] = true; + isAlwaysTriggeredAura[SPELL_AURA_MOD_CONFUSE] = true; isAlwaysTriggeredAura[SPELL_AURA_MOD_FEAR] = true; isAlwaysTriggeredAura[SPELL_AURA_MOD_ROOT] = true; isAlwaysTriggeredAura[SPELL_AURA_MOD_STUN] = true; diff --git a/src/test/server/game/Spells/BreakableCCProcTest.cpp b/src/test/server/game/Spells/BreakableCCProcTest.cpp new file mode 100644 index 000000000..1a81a78f4 --- /dev/null +++ b/src/test/server/game/Spells/BreakableCCProcTest.cpp @@ -0,0 +1,369 @@ +/* + * This file is part of the AzerothCore Project. See AUTHORS file for Copyright information + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along + * with this program. If not, see . + */ + +/** + * @file BreakableCCProcTest.cpp + * @brief Tests for the CC break-on-damage proc mechanism + * + * CC auras (Fear, Polymorph, Stun, Root, Transform) have a damage threshold + * set in CalculateAmount. When damage is taken, HandleBreakableCCAuraProc + * subtracts the damage from the threshold and removes the aura when it + * reaches zero. + * + * The threshold is calculated as: + * BaseHealth(casterLevel, CLASS_WARRIOR) / 4.75 + * + * This gives level 80 a threshold of ~2648 HP (12588 / 4.75). + */ + +#include "AuraStub.h" +#include "ProcChanceTestHelper.h" +#include "ProcEventInfoHelper.h" +#include "SpellMgr.h" +#include "WorldMock.h" +#include "gtest/gtest.h" + +using namespace testing; + +/** + * @brief Simulates HandleBreakableCCAuraProc logic + * + * Mirrors AuraEffect::HandleBreakableCCAuraProc from SpellAuraEffects.cpp: + * damageLeft = GetAmount() - damage + * if (damageLeft <= 0) remove aura + * else SetAmount(damageLeft) + * + * @param effect The CC aura effect stub (amount = damage threshold) + * @param damage Damage dealt to the CC'd target + * @return true if the aura should be removed (threshold exceeded) + */ +static bool SimulateBreakableCCProc(AuraEffectStub* effect, int32_t damage) +{ + int32_t damageLeft = effect->GetAmount() - damage; + if (damageLeft <= 0) + return true; // aura removed + effect->SetAmount(damageLeft); + return false; // aura survives, threshold reduced +} + +/** + * @brief Simulates CalculateAmount for CC auras + * + * Mirrors AuraEffect::CalculateAmount from SpellAuraEffects.cpp for + * MOD_FEAR/MOD_CONFUSE/MOD_STUN/MOD_ROOT/TRANSFORM: + * amount = BaseHealth(casterLevel, CLASS_WARRIOR) / 4.75 + * + * Uses known Warrior base health values from CreatureBaseStats DBC. + */ +static int32_t SimulateCCThreshold(uint8_t casterLevel) +{ + // Warrior base health at key levels (EXPANSION_WRATH_OF_THE_LICH_KING) + // From creature_classlevelstats for CLASS_WARRIOR + struct LevelHealth { uint8_t level; int32_t health; }; + static constexpr LevelHealth table[] = { + {1, 60}, {10, 424}, {20, 1128}, {30, 2078}, {40, 3228}, + {50, 4978}, {60, 7361}, {70, 9940}, {80, 12588}, + }; + + int32_t baseHealth = 12588; // default to level 80 + for (auto const& entry : table) + { + if (entry.level == casterLevel) + { + baseHealth = entry.health; + break; + } + } + + return static_cast(baseHealth / 4.75f); +} + +// ============================================================================= +// Test Fixture +// ============================================================================= + +class BreakableCCProcTest : public ::testing::Test +{ +protected: + void SetUp() override + { + _originalWorld = sWorld.release(); + _worldMock = new NiceMock(); + sWorld.reset(_worldMock); + } + + void TearDown() override + { + IWorld* currentWorld = sWorld.release(); + delete currentWorld; + sWorld.reset(_originalWorld); + } + + /** + * @brief Create a CC aura effect stub with the given threshold + */ + AuraEffectStub CreateCCEffect(int32_t threshold, uint32_t auraType = 7 /* MOD_FEAR */) + { + AuraEffectStub effect(0, threshold, auraType); + return effect; + } + +private: + IWorld* _originalWorld = nullptr; + NiceMock* _worldMock = nullptr; +}; + +// ============================================================================= +// HandleBreakableCCAuraProc Logic Tests +// ============================================================================= + +TEST_F(BreakableCCProcTest, SmallDamage_ReducesThreshold_AuraSurvives) +{ + auto effect = CreateCCEffect(1000); + + bool removed = SimulateBreakableCCProc(&effect, 100); + + EXPECT_FALSE(removed); + EXPECT_EQ(effect.GetAmount(), 900); +} + +TEST_F(BreakableCCProcTest, ExactThresholdDamage_RemovesAura) +{ + auto effect = CreateCCEffect(1000); + + bool removed = SimulateBreakableCCProc(&effect, 1000); + + EXPECT_TRUE(removed); +} + +TEST_F(BreakableCCProcTest, ExceedThresholdDamage_RemovesAura) +{ + auto effect = CreateCCEffect(1000); + + bool removed = SimulateBreakableCCProc(&effect, 5000); + + EXPECT_TRUE(removed); +} + +TEST_F(BreakableCCProcTest, MultipleDamageHits_AccumulateUntilBreak) +{ + auto effect = CreateCCEffect(1000); + + // First hit: 400 damage, 600 remaining + EXPECT_FALSE(SimulateBreakableCCProc(&effect, 400)); + EXPECT_EQ(effect.GetAmount(), 600); + + // Second hit: 300 damage, 300 remaining + EXPECT_FALSE(SimulateBreakableCCProc(&effect, 300)); + EXPECT_EQ(effect.GetAmount(), 300); + + // Third hit: 300 damage, exactly 0 remaining -> remove + EXPECT_TRUE(SimulateBreakableCCProc(&effect, 300)); +} + +TEST_F(BreakableCCProcTest, MultipleDamageHits_OvershootBreak) +{ + auto effect = CreateCCEffect(500); + + // First hit: 200 damage + EXPECT_FALSE(SimulateBreakableCCProc(&effect, 200)); + EXPECT_EQ(effect.GetAmount(), 300); + + // Second hit: 400 damage, exceeds remaining 300 + EXPECT_TRUE(SimulateBreakableCCProc(&effect, 400)); +} + +TEST_F(BreakableCCProcTest, OneDamage_ReducesThreshold) +{ + auto effect = CreateCCEffect(1000); + + EXPECT_FALSE(SimulateBreakableCCProc(&effect, 1)); + EXPECT_EQ(effect.GetAmount(), 999); +} + +// ============================================================================= +// Threshold Calculation Tests (CalculateAmount for CC auras) +// ============================================================================= + +TEST_F(BreakableCCProcTest, Level80Threshold_IsReasonable) +{ + int32_t threshold = SimulateCCThreshold(80); + + // Level 80 warrior base health = 12588 + // Threshold = 12588 / 4.75 ≈ 2650 + EXPECT_GT(threshold, 2600); + EXPECT_LT(threshold, 2700); +} + +TEST_F(BreakableCCProcTest, LowerLevelCaster_LowerThreshold) +{ + int32_t threshold60 = SimulateCCThreshold(60); + int32_t threshold80 = SimulateCCThreshold(80); + + EXPECT_LT(threshold60, threshold80); +} + +TEST_F(BreakableCCProcTest, Level80Fear_BreaksOnModerateDamage) +{ + // Simulate a level 80 warlock's Fear + int32_t threshold = SimulateCCThreshold(80); // ~2650 + auto effect = CreateCCEffect(threshold); + + // A 3000 damage hit should break it + EXPECT_TRUE(SimulateBreakableCCProc(&effect, 3000)); +} + +TEST_F(BreakableCCProcTest, Level80Fear_SurvivesSmallDots) +{ + // Simulate a level 80 warlock's Fear + int32_t threshold = SimulateCCThreshold(80); // ~2650 + auto effect = CreateCCEffect(threshold); + + // Small DoT ticks of 200 each - Fear should survive multiple ticks + for (int i = 0; i < 10; ++i) + { + bool removed = SimulateBreakableCCProc(&effect, 200); + if (i < 12) // Should survive at least 12 ticks (200*13 = 2600 < 2650) + { + // We expect it to survive for ~13 ticks + if (!removed) + continue; + } + if (removed) + { + // Should break around tick 13-14 + EXPECT_GE(i, 12); + return; + } + } + // If we get here, verify remaining threshold + EXPECT_GT(effect.GetAmount(), 0); +} + +// ============================================================================= +// Proc Pipeline Integration Tests (using CanSpellTriggerProcOnEvent) +// ============================================================================= + +TEST_F(BreakableCCProcTest, FearProcEntry_MatchesTakenMeleeDamage) +{ + // Fear's auto-generated proc entry from DBC ProcFlags + auto procEntry = SpellProcEntryBuilder() + .WithProcFlags( + PROC_FLAG_TAKEN_MELEE_AUTO_ATTACK | + PROC_FLAG_TAKEN_SPELL_MELEE_DMG_CLASS | + PROC_FLAG_TAKEN_RANGED_AUTO_ATTACK | + PROC_FLAG_TAKEN_SPELL_RANGED_DMG_CLASS | + PROC_FLAG_TAKEN_SPELL_NONE_DMG_CLASS_NEG | + PROC_FLAG_TAKEN_SPELL_MAGIC_DMG_CLASS_NEG | + PROC_FLAG_TAKEN_PERIODIC) + .WithSpellTypeMask(PROC_SPELL_TYPE_DAMAGE) + .WithSpellPhaseMask(PROC_SPELL_PHASE_HIT) + .WithChance(100.0f) + .Build(); + + // Melee auto attack should trigger + auto meleeEvent = ProcEventInfoBuilder() + .WithTypeMask(PROC_FLAG_TAKEN_MELEE_AUTO_ATTACK) + .WithHitMask(PROC_HIT_NORMAL) + .WithSpellTypeMask(PROC_SPELL_TYPE_DAMAGE) + .WithSpellPhaseMask(PROC_SPELL_PHASE_HIT) + .Build(); + + EXPECT_TRUE(sSpellMgr->CanSpellTriggerProcOnEvent(procEntry, meleeEvent)); +} + +TEST_F(BreakableCCProcTest, FearProcEntry_MatchesTakenSpellDamage) +{ + auto procEntry = SpellProcEntryBuilder() + .WithProcFlags( + PROC_FLAG_TAKEN_MELEE_AUTO_ATTACK | + PROC_FLAG_TAKEN_SPELL_MELEE_DMG_CLASS | + PROC_FLAG_TAKEN_RANGED_AUTO_ATTACK | + PROC_FLAG_TAKEN_SPELL_RANGED_DMG_CLASS | + PROC_FLAG_TAKEN_SPELL_NONE_DMG_CLASS_NEG | + PROC_FLAG_TAKEN_SPELL_MAGIC_DMG_CLASS_NEG | + PROC_FLAG_TAKEN_PERIODIC) + .WithSpellTypeMask(PROC_SPELL_TYPE_DAMAGE) + .WithSpellPhaseMask(PROC_SPELL_PHASE_HIT) + .WithChance(100.0f) + .Build(); + + // Magic damage spell should trigger + auto spellEvent = ProcEventInfoBuilder() + .WithTypeMask(PROC_FLAG_TAKEN_SPELL_MAGIC_DMG_CLASS_NEG) + .WithHitMask(PROC_HIT_NORMAL) + .WithSpellTypeMask(PROC_SPELL_TYPE_DAMAGE) + .WithSpellPhaseMask(PROC_SPELL_PHASE_HIT) + .Build(); + + EXPECT_TRUE(sSpellMgr->CanSpellTriggerProcOnEvent(procEntry, spellEvent)); +} + +TEST_F(BreakableCCProcTest, FearProcEntry_DoesNotMatchHealEvent) +{ + auto procEntry = SpellProcEntryBuilder() + .WithProcFlags( + PROC_FLAG_TAKEN_MELEE_AUTO_ATTACK | + PROC_FLAG_TAKEN_SPELL_MELEE_DMG_CLASS | + PROC_FLAG_TAKEN_RANGED_AUTO_ATTACK | + PROC_FLAG_TAKEN_SPELL_RANGED_DMG_CLASS | + PROC_FLAG_TAKEN_SPELL_NONE_DMG_CLASS_NEG | + PROC_FLAG_TAKEN_SPELL_MAGIC_DMG_CLASS_NEG | + PROC_FLAG_TAKEN_PERIODIC) + .WithSpellTypeMask(PROC_SPELL_TYPE_DAMAGE) + .WithSpellPhaseMask(PROC_SPELL_PHASE_HIT) + .WithChance(100.0f) + .Build(); + + // Heal should NOT trigger Fear's proc + auto healEvent = ProcEventInfoBuilder() + .WithTypeMask(PROC_FLAG_TAKEN_SPELL_MAGIC_DMG_CLASS_POS) + .WithHitMask(PROC_HIT_NORMAL) + .WithSpellTypeMask(PROC_SPELL_TYPE_HEAL) + .WithSpellPhaseMask(PROC_SPELL_PHASE_HIT) + .Build(); + + EXPECT_FALSE(sSpellMgr->CanSpellTriggerProcOnEvent(procEntry, healEvent)); +} + +TEST_F(BreakableCCProcTest, FearProcChance_Is100Percent) +{ + auto procEntry = SpellProcEntryBuilder() + .WithChance(100.0f) + .Build(); + + // Fear has 100% proc chance from DBC - every damage event triggers + float chance = ProcChanceTestHelper::SimulateCalcProcChance(procEntry); + EXPECT_FLOAT_EQ(chance, 100.0f); +} + +// ============================================================================= +// Glyph of Fear Threshold Modifier Test +// ============================================================================= + +TEST_F(BreakableCCProcTest, GlyphOfFear_IncreasesThreshold) +{ + // Glyph of Fear adds +100% to the damage threshold (MiscValue 7801) + int32_t baseThreshold = SimulateCCThreshold(80); // ~2650 + int32_t glyphedThreshold = baseThreshold + (baseThreshold * 100 / 100); // +100% + + auto effect = CreateCCEffect(glyphedThreshold); + + // Should survive hits that would normally break it + EXPECT_FALSE(SimulateBreakableCCProc(&effect, 3000)); + EXPECT_GT(effect.GetAmount(), 0); +} From 0994714bd1cef1364154c353091585bcbac9843d Mon Sep 17 00:00:00 2001 From: Andrew <47818697+Nyeriah@users.noreply.github.com> Date: Sat, 21 Feb 2026 19:50:14 -0300 Subject: [PATCH 015/150] fix(Scripts/EoE): Implement Malygos Vortex (#24726) Co-authored-by: Manuel Carrasco (maanuel) Co-authored-by: Claude Opus 4.6 Co-authored-by: Manuel Carrasco Co-authored-by: Trista --- .../rev_vortex_spell_scripts.sql | 24 ++ .../game/Spells/SpellInfoCorrections.cpp | 6 - .../Nexus/EyeOfEternity/boss_malygos.cpp | 269 ++++++++---------- .../Nexus/EyeOfEternity/eye_of_eternity.h | 8 +- .../instance_eye_of_eternity.cpp | 49 ++++ 5 files changed, 191 insertions(+), 165 deletions(-) create mode 100644 data/sql/updates/pending_db_world/rev_vortex_spell_scripts.sql diff --git a/data/sql/updates/pending_db_world/rev_vortex_spell_scripts.sql b/data/sql/updates/pending_db_world/rev_vortex_spell_scripts.sql new file mode 100644 index 000000000..1d35e2f20 --- /dev/null +++ b/data/sql/updates/pending_db_world/rev_vortex_spell_scripts.sql @@ -0,0 +1,24 @@ +DELETE FROM `spell_script_names` WHERE `spell_id` IN (56105, 55873); +INSERT INTO `spell_script_names` (`spell_id`, `ScriptName`) VALUES +(56105, 'spell_malygos_vortex_dummy'), +(55873, 'spell_malygos_vortex_visual'); + +DELETE FROM `creature` WHERE `guid` IN (132304, 132305, 132306, 132307, 132308); +INSERT INTO `creature` +(`guid`, `id1`, `map`, `zoneId`, `areaId`, `spawnMask`, `phaseMask`, `equipment_id`, + `position_x`, `position_y`, `position_z`, `orientation`, + `spawntimesecs`, `wander_distance`, `currentwaypoint`, + `curhealth`, `curmana`, `MovementType`, `npcflag`, + `unit_flags`, `dynamicflags`, `ScriptName`, `VerifiedBuild`) +VALUES +(132304,30090,616,0,0,3,1,0,754.733,1301.51,283.379,5.58505,3600,0,0,12600,0,0,0,0,0,'',0), +(132305,30090,616,0,0,3,1,0,754.521,1301.23,279.524,0.680678,3600,0,0,12600,0,0,0,0,0,'',0), +(132306,30090,616,0,0,3,1,0,754.356,1301.48,285.733,5.96903,3600,0,0,12600,0,0,0,0,0,'',0), +(132307,30090,616,0,0,3,1,0,754.192,1301.18,281.851,5.75959,3600,0,0,12600,0,0,0,0,0,'',0), +(132308,30090,616,0,0,3,1,0,754.688,1301.8,287.295,1.25664,3600,0,0,12600,0,0,0,0,0,'',0); + +UPDATE `creature_template` SET `unit_flags` = `unit_flags`|33554432, `VehicleId` = 214, `flags_extra` = `flags_extra`|2|128, `ScriptName` = '' WHERE `entry` = 30090; + +DELETE FROM `creature_template_addon` WHERE `entry` = 30090; +INSERT INTO `creature_template_addon` (`entry`, `path_id`, `mount`, `bytes1`, `bytes2`, `emote`, `visibilityDistanceType`, `auras`) VALUES +(30090, 0, 0, 0, 0, 0, 0, '55883'); diff --git a/src/server/game/Spells/SpellInfoCorrections.cpp b/src/server/game/Spells/SpellInfoCorrections.cpp index 66e77fa95..86bd0acc6 100644 --- a/src/server/game/Spells/SpellInfoCorrections.cpp +++ b/src/server/game/Spells/SpellInfoCorrections.cpp @@ -1892,12 +1892,6 @@ void SpellMgr::LoadSpellInfoCorrections() spellInfo->Effects[EFFECT_0].TargetA = SpellImplicitTargetInfo(TARGET_DEST_DEST); }); - // Vortex (freeze anim) - ApplySpellFix({ 55883 }, [](SpellInfo* spellInfo) - { - spellInfo->AuraInterruptFlags |= AURA_INTERRUPT_FLAG_CHANGE_MAP; - }); - // Hurl Pyrite ApplySpellFix({ 62490 }, [](SpellInfo* spellInfo) { diff --git a/src/server/scripts/Northrend/Nexus/EyeOfEternity/boss_malygos.cpp b/src/server/scripts/Northrend/Nexus/EyeOfEternity/boss_malygos.cpp index 67c9af88e..7c68f7a4f 100644 --- a/src/server/scripts/Northrend/Nexus/EyeOfEternity/boss_malygos.cpp +++ b/src/server/scripts/Northrend/Nexus/EyeOfEternity/boss_malygos.cpp @@ -19,8 +19,6 @@ #include "CreatureScript.h" #include "GameObjectAI.h" #include "GameObjectScript.h" -#include "MoveSplineInit.h" -#include "Opcodes.h" #include "PassiveAI.h" #include "Player.h" #include "ScriptMgr.h" @@ -61,9 +59,11 @@ enum MalygosSpells SPELL_ARCANE_BREATH = 56272, SPELL_ARCANE_STORM = 61693, + SPELL_VORTEX_1 = 56237, SPELL_VORTEX_VISUAL = 55873, + SPELL_VORTEX_DUMMY = 56105, + SPELL_VORTEX_TELEPORT = 73040, SPELL_VORTEX_CONTROL_VEHICLE = 56263, - SPELL_FREEZE_ANIM = 55883, SPELL_ARCANE_OVERLOAD = 56430, SPELL_ARCANE_OVERLOAD_SUMMON = 56429, @@ -195,6 +195,7 @@ struct boss_malygos : public BossAI uint32 timer1, timer2; uint8 IntroCounter; bool bLockHealthCheck; + bool _executingVortex; void InitializeAI() override { @@ -210,6 +211,7 @@ struct boss_malygos : public BossAI timer2 = INTRO_MOVEMENT_INTERVAL; IntroCounter = 0; bLockHealthCheck = false; + _executingVortex = false; SetInvincibility(true); me->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_ONESHOT_NONE); @@ -223,7 +225,7 @@ struct boss_malygos : public BossAI void MovementInform(uint32 type, uint32 id) override { - if (type != POINT_MOTION_TYPE) + if (type != POINT_MOTION_TYPE && type != EFFECT_MOTION_TYPE) return; switch (id) @@ -245,9 +247,8 @@ struct boss_malygos : public BossAI events.RescheduleEvent(EVENT_INTRO_LAND, 0ms, 1); break; case MI_POINT_VORTEX_CENTER: - if (Creature* trigger = me->SummonCreature(NPC_WORLD_TRIGGER_LAOI, CenterPos, TEMPSUMMON_TIMED_DESPAWN, 15000)) - trigger->CastSpell(trigger, SPELL_VORTEX_VISUAL, true); - events.RescheduleEvent(EVENT_START_VORTEX_REAL, 1s, 1); + me->GetMotionMaster()->MoveIdle(); + events.RescheduleEvent(EVENT_START_VORTEX_REAL, 0ms, 1); break; case MI_POINT_CENTER_GROUND_PH_2: events.RescheduleEvent(EVENT_START_PHASE_2_FLY_UP, 0ms, 1); @@ -384,10 +385,20 @@ struct boss_malygos : public BossAI break; } case EVENT_SPELL_ARCANE_BREATH: + if (_executingVortex) + { + events.Repeat(12s, 15s); + break; + } me->CastSpell(me->GetVictim(), SPELL_ARCANE_BREATH, false); events.Repeat(12s, 15s); break; case EVENT_SPELL_ARCANE_STORM: + if (_executingVortex) + { + events.Repeat(10s, 15s); + break; + } me->CastCustomSpell(SPELL_ARCANE_STORM, SPELLVALUE_MAX_TARGETS, DUNGEON_MODE(5, 12), me, true); events.Repeat(10s, 15s); break; @@ -407,6 +418,7 @@ struct boss_malygos : public BossAI break; case EVENT_START_VORTEX_0: { + _executingVortex = true; bLockHealthCheck = true; Talk(SAY_MAGIC_BLAST); EntryCheckPredicate pred(NPC_POWER_SPARK); @@ -425,7 +437,9 @@ struct boss_malygos : public BossAI } break; case EVENT_VORTEX_FLY_TO_CENTER: - me->GetMotionMaster()->MovePoint(MI_POINT_VORTEX_CENTER, CenterPos.GetPositionX(), CenterPos.GetPositionY(), CenterPos.GetPositionZ() + 20.0f); + me->SetReactState(REACT_PASSIVE); + me->AttackStop(); + me->GetMotionMaster()->MovePoint(MI_POINT_VORTEX_CENTER, VortexPos); break; case EVENT_START_VORTEX_REAL: { @@ -433,63 +447,9 @@ struct boss_malygos : public BossAI me->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_STATE_CUSTOM_SPELL_01); me->HandleEmoteCommand(EMOTE_STATE_CUSTOM_SPELL_01); - Position pos; - float angle = (me->GetOrientation() >= M_PI / 4 ? me->GetOrientation() - M_PI / 4 : 7 * M_PI / 4 + me->GetOrientation()); - pos.m_positionX = CenterPos.GetPositionX() + cos(angle) * 40.0f; - pos.m_positionY = CenterPos.GetPositionY() + std::sin(angle) * 40.0f; - pos.m_positionZ = CenterPos.GetPositionZ() + 20.0f; - pos.SetOrientation(pos.GetAngle(&CenterPos)); - - if (Creature* vp = me->SummonCreature(NPC_WORLD_TRIGGER_LAOI, pos, TEMPSUMMON_TIMED_DESPAWN, 14000)) - { - vp->SetDisableGravity(true); - - me->GetMap()->DoForAllPlayers([&](Player* player) - { - if (!player->IsAlive() || player->IsGameMaster()) - return; - - Position plrpos; - float playerAngle = CenterPos.GetAngle(player); - plrpos.m_positionX = CenterPos.GetPositionX() + cos(playerAngle) * 5.0f; - plrpos.m_positionY = CenterPos.GetPositionY() + std::sin(playerAngle) * 5.0f; - plrpos.m_positionZ = CenterPos.GetPositionZ() + 18.0f; - plrpos.SetOrientation(plrpos.GetAngle(&CenterPos)); - - if (Creature* vortex = me->SummonCreature(NPC_VORTEX, plrpos, TEMPSUMMON_TIMED_DESPAWN, 15000)) - { - player->CastSpell(player, SPELL_FREEZE_ANIM, true); - player->CastSpell(vortex, SPELL_VORTEX_CONTROL_VEHICLE, true); - if (!player->GetVehicle()) // didn't work somehow, try again with a different way, if fails - break - { - player->EnterVehicle(vortex, 0); - if (!player->GetVehicle()) - return; - } - //player->ClearUnitState(UNIT_STATE_ONVEHICLE); - - Movement::MoveSplineInit init(player); // TODO: has to be removed and handled with vehicle exit and vehicle enter code - init.MoveTo(CenterPos.GetPositionX(), CenterPos.GetPositionY(), CenterPos.GetPositionZ()); - init.SetFacing(player->GetOrientation()); - init.SetTransportExit(); - init.Launch(); - - player->SetUnitMovementFlags(MOVEMENTFLAG_NONE); - player->SetDisableGravity(true); - - WorldPacket data(SMSG_SPLINE_MOVE_UNROOT, 8); - data << player->GetPackGUID(); - player->SendMessageToSet(&data, true); - - sScriptMgr->AnticheatSetUnderACKmount(player); - - player->SetGuidValue(PLAYER_FARSIGHT, vp->GetGUID()); - vortex->SetUnitFlag(UNIT_FLAG_NOT_SELECTABLE); - } - }); - } - - events.RescheduleEvent(EVENT_VORTEX_LAND_0, 11s, 1); + me->CastSpell(me, SPELL_VORTEX_1, true); + me->CastSpell(me, SPELL_VORTEX_VISUAL, true); + me->CastSpell(me, SPELL_VORTEX_DUMMY, true); break; } case EVENT_VORTEX_LAND_0: @@ -497,10 +457,12 @@ struct boss_malygos : public BossAI break; case EVENT_VORTEX_LAND_1: { + _executingVortex = false; bLockHealthCheck = false; EntryCheckPredicate pred(NPC_POWER_SPARK); summons.DoAction(ACTION_POWER_SPARK_FOLLOW, pred); me->RemoveUnitFlag(UNIT_FLAG_PACIFIED); + me->SetReactState(REACT_AGGRESSIVE); me->ResumeChasingVictim(); events.RescheduleEvent(EVENT_START_VORTEX_0, 60s, 1); break; @@ -779,98 +741,6 @@ struct boss_malygos : public BossAI } }; -#define VORTEX_DEFAULT_DIFF 250 -#define VORTEX_TRAVEL_TIME 3000 - -struct npc_vortex_ride : public VehicleAI -{ - npc_vortex_ride(Creature* creature) : VehicleAI(creature) - { - vortexRadius = urand(22, 28); - float h = urand(15, 30); - float angle = CenterPos.GetAngle(me); - Position pos; - pos.m_positionX = CenterPos.GetPositionX() + vortexRadius * cos(angle); - pos.m_positionY = CenterPos.GetPositionY() + vortexRadius * std::sin(angle); - pos.m_positionZ = CenterPos.GetPositionZ() + h; - pos.SetOrientation(pos.GetAngle(&CenterPos)); - me->SetPosition(pos); - timer = 0; - despawnTimer = 9500; - bUpdatedFlying = false; - } - - uint32 timer; - uint32 despawnTimer; - bool bUpdatedFlying; - float vortexRadius; - - void PassengerBoarded(Unit* pass, int8 /*seat*/, bool apply) override - { - if (!pass || apply || !pass->IsPlayer()) - return; - - Player* player = pass->ToPlayer(); - float speed = player->GetDistance(me->GetPositionX(), me->GetPositionY(), me->GetPositionZ()) / (1.0f * 0.001f); - player->SetDisableGravity(false); // packet only would lead to issues elsewhere - player->GetMotionMaster()->MoveCharge(me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), speed); - player->RemoveAura(SPELL_FREEZE_ANIM); - player->SetGuidValue(PLAYER_FARSIGHT, ObjectGuid::Empty); - - sScriptMgr->AnticheatSetCanFlybyServer(player, false); - sScriptMgr->AnticheatSetUnderACKmount(player); - } - - void UpdateAI(uint32 diff) override - { - if (despawnTimer <= diff) - { - despawnTimer = 0; - me->UpdatePosition(CenterPos.GetPositionX(), CenterPos.GetPositionY(), CenterPos.GetPositionZ() + 18.0f, 0.0f, true); - me->StopMovingOnCurrentPos(); - if (Vehicle* vehicle = me->GetVehicleKit()) - vehicle->RemoveAllPassengers(); - me->DespawnOrUnsummon(); - return; - } - else - despawnTimer -= diff; - - if (timer <= diff) - { - float angle = CenterPos.GetAngle(me); - float newangle = angle + 2 * M_PI / ((float)VORTEX_TRAVEL_TIME / VORTEX_DEFAULT_DIFF); - if (newangle >= 2 * M_PI) - newangle -= 2 * M_PI; - float newx = CenterPos.GetPositionX() + vortexRadius * cos(newangle); - float newy = CenterPos.GetPositionY() + vortexRadius * std::sin(newangle); - float arcangle = me->GetAngle(newx, newy); - float dist = 2 * me->GetDistance2d(newx, newy); - if (me->GetVehicleKit()) - if (Unit* pass = me->GetVehicleKit()->GetPassenger(0)) - if (Player* player = pass->ToPlayer()) - { - if (!bUpdatedFlying && timer) - { - bUpdatedFlying = true; - player->SetDisableGravity(true); - } - - player->SendMonsterMove(me->GetPositionX() + dist * cos(arcangle), me->GetPositionY() + dist * std::sin(arcangle), me->GetPositionZ(), VORTEX_DEFAULT_DIFF * 2, SPLINEFLAG_FLYING); - me->Relocate(newx, newy); - } - - timer = (diff - timer <= VORTEX_DEFAULT_DIFF) ? VORTEX_DEFAULT_DIFF - (diff - timer) : 0; - } - else - timer -= diff; - } - - void AttackStart(Unit* /*who*/) override {} - void MoveInLineOfSight(Unit* /*who*/) override {} - void DamageTaken(Unit*, uint32& damage, DamageEffectType, SpellSchoolMask) override { damage = 0; } -}; - struct npc_power_spark : public NullCreatureAI { npc_power_spark(Creature* creature) : NullCreatureAI(creature) @@ -948,7 +818,15 @@ struct npc_power_spark : public NullCreatureAI { if (_instance) if (Creature* malygos = _instance->GetCreature(DATA_MALYGOS)) + { + if (malygos->HasAura(SPELL_VORTEX_1)) + { + me->GetMotionMaster()->MoveIdle(); + _moveTimer = 2000; + return; + } me->GetMotionMaster()->MovePoint(0, *malygos); + } _moveTimer = 2000; } else @@ -1273,6 +1151,80 @@ struct go_the_focusing_iris : public GameObjectAI } }; +// 56105 - Vortex +class spell_malygos_vortex_dummy : public SpellScript +{ + PrepareSpellScript(spell_malygos_vortex_dummy); + + bool Load() override + { + return GetCaster()->IsCreature(); + } + + void HandleScript(SpellEffIndex /*effIndex*/) + { + Creature* caster = GetCaster()->ToCreature(); + if (!caster) + return; + + if (InstanceScript* instance = caster->GetInstanceScript()) + instance->SetData(DATA_VORTEX_HANDLING, 0); + } + + void Register() override + { + OnEffectHitTarget += SpellEffectFn(spell_malygos_vortex_dummy::HandleScript, EFFECT_0, SPELL_EFFECT_DUMMY); + } +}; + +// 55873 - Vortex +class spell_malygos_vortex_visual : public AuraScript +{ + PrepareAuraScript(spell_malygos_vortex_visual); + + bool Load() override + { + return GetCaster()->IsCreature(); + } + + bool Validate(SpellInfo const* /*spell*/) override + { + return ValidateSpellInfo({ SPELL_VORTEX_1, SPELL_VORTEX_TELEPORT }); + } + + void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + { + Creature* caster = GetCaster()->ToCreature(); + if (!caster) + return; + + for (auto const* ref : caster->GetThreatMgr().GetUnsortedThreatList()) + { + if (Player* player = ref->GetVictim()->ToPlayer()) + { + if (player->IsGameMaster()) + continue; + + if (InstanceScript* instance =caster->GetInstanceScript()) + { + if (Creature* trigger =ObjectAccessor::GetCreature(*caster, instance->GetGuidData(DATA_VORTEX_TRIGGER))) + trigger->CastSpell(player, SPELL_VORTEX_TELEPORT, true); + } + } + } + + caster->GetMotionMaster()->MoveLand(MI_POINT_VORTEX_LAND, VortexLandPos); + caster->RemoveAura(SPELL_VORTEX_1); + } + + void Register() override + { + AfterEffectRemove += AuraEffectRemoveFn( + spell_malygos_vortex_visual::OnRemove, + EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); + } +}; + class spell_eoe_ph3_surge_of_power : public SpellScript { PrepareSpellScript(spell_eoe_ph3_surge_of_power); @@ -1363,7 +1315,6 @@ void AddSC_boss_malygos() { RegisterEoECreatureAI(boss_malygos); RegisterEoECreatureAI(npc_power_spark); - RegisterEoECreatureAI(npc_vortex_ride); RegisterEoECreatureAI(npc_alexstrasza); RegisterGameObjectAI(go_the_focusing_iris); RegisterEoECreatureAI(npc_nexus_lord); @@ -1374,4 +1325,6 @@ void AddSC_boss_malygos() RegisterSpellScript(spell_wyrmrest_skytalon_ride_red_dragon_buddy_trigger); RegisterSpellScript(spell_eoe_ph3_surge_of_power); + RegisterSpellScript(spell_malygos_vortex_dummy); + RegisterSpellScript(spell_malygos_vortex_visual); } diff --git a/src/server/scripts/Northrend/Nexus/EyeOfEternity/eye_of_eternity.h b/src/server/scripts/Northrend/Nexus/EyeOfEternity/eye_of_eternity.h index c77eb635c..d46499c5c 100644 --- a/src/server/scripts/Northrend/Nexus/EyeOfEternity/eye_of_eternity.h +++ b/src/server/scripts/Northrend/Nexus/EyeOfEternity/eye_of_eternity.h @@ -60,6 +60,8 @@ enum Data DATA_IRIS_ACTIVATED, DATA_SET_IRIS_INACTIVE, DATA_HIDE_IRIS_AND_PORTAL, + DATA_VORTEX_HANDLING, + DATA_VORTEX_TRIGGER, }; enum eSpells @@ -78,7 +80,9 @@ enum eSpells SPELL_ALEXSTRASZA_GIFT = 61028, SPELL_SUMMON_RED_DRAGON_BUDDY = 56070, - SPELL_RIDE_RED_DRAGON = 56072 + SPELL_RIDE_RED_DRAGON = 56072, + + SPELL_VORTEX_4 = 55853, }; enum eAchiev @@ -116,6 +120,8 @@ enum AlexstraszaEvents /*** POSITIONS/WAYPOINTS BELOW ***/ const Position CenterPos = {754.395f, 1301.27f, 266.10f, 0.0f}; +const Position VortexPos = {754.393f, 1301.27f, 292.91f, 0.0f}; +const Position VortexLandPos = {754.362f, 1301.61f, 266.17f, 0.0f}; const Position FourSidesPos[] = { diff --git a/src/server/scripts/Northrend/Nexus/EyeOfEternity/instance_eye_of_eternity.cpp b/src/server/scripts/Northrend/Nexus/EyeOfEternity/instance_eye_of_eternity.cpp index 0b4e5060f..c14e71177 100644 --- a/src/server/scripts/Northrend/Nexus/EyeOfEternity/instance_eye_of_eternity.cpp +++ b/src/server/scripts/Northrend/Nexus/EyeOfEternity/instance_eye_of_eternity.cpp @@ -48,6 +48,52 @@ struct instance_eye_of_eternity : public InstanceScript } bool _pokeAchievementValid = false; + GuidVector _vortexTriggers; + + void OnCreatureCreate(Creature* creature) override + { + InstanceScript::OnCreatureCreate(creature); + + if (creature->GetEntry() == NPC_VORTEX) + _vortexTriggers.push_back(creature->GetGUID()); + } + + ObjectGuid GetGuidData(uint32 data) const override + { + if (data == DATA_VORTEX_TRIGGER) + return !_vortexTriggers.empty() ? _vortexTriggers.front() : ObjectGuid::Empty; + + return InstanceScript::GetGuidData(data); + } + + void VortexHandling() + { + Creature* malygos = GetCreature(DATA_MALYGOS); + if (!malygos) + return; + + for (ObjectGuid const& guid : _vortexTriggers) + { + uint8 counter = 0; + if (Creature* trigger = instance->GetCreature(guid)) + { + for (auto* ref : malygos->GetThreatMgr().GetUnsortedThreatList()) + { + if (counter >= 5) + break; + + if (Player* player = ref->GetVictim()->ToPlayer()) + { + if (player->IsGameMaster() || player->HasAura(SPELL_VORTEX_4)) + continue; + + player->CastSpell(trigger, SPELL_VORTEX_4, true); + counter++; + } + } + } + } + } void OnPlayerEnter(Player* player) override { @@ -108,6 +154,9 @@ struct instance_eye_of_eternity : public InstanceScript if (GameObject* portal = GetGameObject(DATA_EXIT_PORTAL)) portal->SetPhaseMask(2, true); break; + case DATA_VORTEX_HANDLING: + VortexHandling(); + break; } } From def5924d3be70267471333f47f27fe25aca1e088 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Sat, 21 Feb 2026 22:51:24 +0000 Subject: [PATCH 016/150] chore(DB): import pending files Referenced commit(s): 0994714bd1cef1364154c353091585bcbac9843d --- .../rev_vortex_spell_scripts.sql => db_world/2026_02_21_04.sql} | 1 + 1 file changed, 1 insertion(+) rename data/sql/updates/{pending_db_world/rev_vortex_spell_scripts.sql => db_world/2026_02_21_04.sql} (97%) diff --git a/data/sql/updates/pending_db_world/rev_vortex_spell_scripts.sql b/data/sql/updates/db_world/2026_02_21_04.sql similarity index 97% rename from data/sql/updates/pending_db_world/rev_vortex_spell_scripts.sql rename to data/sql/updates/db_world/2026_02_21_04.sql index 1d35e2f20..0fdea4d91 100644 --- a/data/sql/updates/pending_db_world/rev_vortex_spell_scripts.sql +++ b/data/sql/updates/db_world/2026_02_21_04.sql @@ -1,3 +1,4 @@ +-- DB update 2026_02_21_03 -> 2026_02_21_04 DELETE FROM `spell_script_names` WHERE `spell_id` IN (56105, 55873); INSERT INTO `spell_script_names` (`spell_id`, `ScriptName`) VALUES (56105, 'spell_malygos_vortex_dummy'), From a4e1975a334586095b69dc2af0b1b1ace7165354 Mon Sep 17 00:00:00 2001 From: Andrew <47818697+Nyeriah@users.noreply.github.com> Date: Sun, 22 Feb 2026 05:14:02 -0300 Subject: [PATCH 017/150] fix(DB/Creature): Fix Power Spark movement (#24798) --- .../updates/pending_db_world/rev_1771736808435225100.sql | 8 ++++++++ .../Northrend/Nexus/EyeOfEternity/boss_malygos.cpp | 1 - 2 files changed, 8 insertions(+), 1 deletion(-) create mode 100644 data/sql/updates/pending_db_world/rev_1771736808435225100.sql diff --git a/data/sql/updates/pending_db_world/rev_1771736808435225100.sql b/data/sql/updates/pending_db_world/rev_1771736808435225100.sql new file mode 100644 index 000000000..baaa3a046 --- /dev/null +++ b/data/sql/updates/pending_db_world/rev_1771736808435225100.sql @@ -0,0 +1,8 @@ +-- +DELETE FROM `creature_template_addon` WHERE `entry` = 30084; +INSERT INTO `creature_template_addon` (`entry`, `path_id`, `mount`, `bytes1`, `bytes2`, `emote`, `visibilityDistanceType`, `auras`) VALUES +(30084, 0, 0, 0, 0, 0, 0, '55845'); + +DELETE FROM `creature_template_movement` WHERE `CreatureId` = 30084; +INSERT INTO `creature_template_movement` (`CreatureId`, `Flight`) VALUES +(30084, 1); diff --git a/src/server/scripts/Northrend/Nexus/EyeOfEternity/boss_malygos.cpp b/src/server/scripts/Northrend/Nexus/EyeOfEternity/boss_malygos.cpp index 7c68f7a4f..2f965f509 100644 --- a/src/server/scripts/Northrend/Nexus/EyeOfEternity/boss_malygos.cpp +++ b/src/server/scripts/Northrend/Nexus/EyeOfEternity/boss_malygos.cpp @@ -746,7 +746,6 @@ struct npc_power_spark : public NullCreatureAI npc_power_spark(Creature* creature) : NullCreatureAI(creature) { _instance = me->GetInstanceScript(); - me->CastSpell(me, SPELL_POWER_SPARK_VISUAL, false); _checkTimer = 1000; _moveTimer = 0; } From 65cbe0a8187d0d192104b964d0e4cca8326d5ecd Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Sun, 22 Feb 2026 08:15:04 +0000 Subject: [PATCH 018/150] chore(DB): import pending files Referenced commit(s): a4e1975a334586095b69dc2af0b1b1ace7165354 --- .../rev_1771736808435225100.sql => db_world/2026_02_22_00.sql} | 1 + 1 file changed, 1 insertion(+) rename data/sql/updates/{pending_db_world/rev_1771736808435225100.sql => db_world/2026_02_22_00.sql} (89%) diff --git a/data/sql/updates/pending_db_world/rev_1771736808435225100.sql b/data/sql/updates/db_world/2026_02_22_00.sql similarity index 89% rename from data/sql/updates/pending_db_world/rev_1771736808435225100.sql rename to data/sql/updates/db_world/2026_02_22_00.sql index baaa3a046..d672711a7 100644 --- a/data/sql/updates/pending_db_world/rev_1771736808435225100.sql +++ b/data/sql/updates/db_world/2026_02_22_00.sql @@ -1,3 +1,4 @@ +-- DB update 2026_02_21_04 -> 2026_02_22_00 -- DELETE FROM `creature_template_addon` WHERE `entry` = 30084; INSERT INTO `creature_template_addon` (`entry`, `path_id`, `mount`, `bytes1`, `bytes2`, `emote`, `visibilityDistanceType`, `auras`) VALUES From 0759d4700094709d3af37102a5160c362de247ae Mon Sep 17 00:00:00 2001 From: Andrew <47818697+Nyeriah@users.noreply.github.com> Date: Sun, 22 Feb 2026 10:55:18 -0300 Subject: [PATCH 019/150] fix(Scripts/EoE): Remove useless Focusing Iris script (#24804) --- .../rev_1771764309163193800.sql | 2 + .../Nexus/EyeOfEternity/boss_malygos.cpp | 14 ------ .../Nexus/EyeOfEternity/eye_of_eternity.h | 3 +- .../instance_eye_of_eternity.cpp | 48 ++++++++----------- 4 files changed, 23 insertions(+), 44 deletions(-) create mode 100644 data/sql/updates/pending_db_world/rev_1771764309163193800.sql diff --git a/data/sql/updates/pending_db_world/rev_1771764309163193800.sql b/data/sql/updates/pending_db_world/rev_1771764309163193800.sql new file mode 100644 index 000000000..797a96634 --- /dev/null +++ b/data/sql/updates/pending_db_world/rev_1771764309163193800.sql @@ -0,0 +1,2 @@ +-- +UPDATE `gameobject_template` SET `ScriptName` = '' WHERE `entry` IN (193958, 193960) AND `ScriptName` = 'go_the_focusing_iris'; diff --git a/src/server/scripts/Northrend/Nexus/EyeOfEternity/boss_malygos.cpp b/src/server/scripts/Northrend/Nexus/EyeOfEternity/boss_malygos.cpp index 2f965f509..2f228e856 100644 --- a/src/server/scripts/Northrend/Nexus/EyeOfEternity/boss_malygos.cpp +++ b/src/server/scripts/Northrend/Nexus/EyeOfEternity/boss_malygos.cpp @@ -1137,19 +1137,6 @@ struct npc_eoe_wyrmrest_skytalon : public VehicleAI } }; -struct go_the_focusing_iris : public GameObjectAI -{ - go_the_focusing_iris(GameObject* go) : GameObjectAI(go) { } - - bool GossipHello(Player* /*user*/, bool /*reportUse*/) override - { - if (InstanceScript* instance = me->GetInstanceScript()) - instance->SetData(DATA_IRIS_ACTIVATED, 0); - - return true; - } -}; - // 56105 - Vortex class spell_malygos_vortex_dummy : public SpellScript { @@ -1315,7 +1302,6 @@ void AddSC_boss_malygos() RegisterEoECreatureAI(boss_malygos); RegisterEoECreatureAI(npc_power_spark); RegisterEoECreatureAI(npc_alexstrasza); - RegisterGameObjectAI(go_the_focusing_iris); RegisterEoECreatureAI(npc_nexus_lord); RegisterEoECreatureAI(npc_scion_of_eternity); RegisterEoECreatureAI(npc_hover_disk); diff --git a/src/server/scripts/Northrend/Nexus/EyeOfEternity/eye_of_eternity.h b/src/server/scripts/Northrend/Nexus/EyeOfEternity/eye_of_eternity.h index d46499c5c..8d6eed06c 100644 --- a/src/server/scripts/Northrend/Nexus/EyeOfEternity/eye_of_eternity.h +++ b/src/server/scripts/Northrend/Nexus/EyeOfEternity/eye_of_eternity.h @@ -97,7 +97,8 @@ enum eAchiev enum EoEMisc : uint32 { AREA_EYE_OF_ETERNITY = 4500, - EVENT_IRIS_ACTIVATED = 20158, + EVENT_DESTROY_PLATFORM = 20158, + EVENT_IRIS_ACTIVATED = 20711, PLATFORM_DESTROY_DAMAGE = 6500000, INTRO_MOVEMENT_INTERVAL = 25000, }; diff --git a/src/server/scripts/Northrend/Nexus/EyeOfEternity/instance_eye_of_eternity.cpp b/src/server/scripts/Northrend/Nexus/EyeOfEternity/instance_eye_of_eternity.cpp index c14e71177..efa2bcf9f 100644 --- a/src/server/scripts/Northrend/Nexus/EyeOfEternity/instance_eye_of_eternity.cpp +++ b/src/server/scripts/Northrend/Nexus/EyeOfEternity/instance_eye_of_eternity.cpp @@ -97,15 +97,7 @@ struct instance_eye_of_eternity : public InstanceScript void OnPlayerEnter(Player* player) override { - if (GetBossState(DATA_MALYGOS) != DONE) - return; - - ProcessEvent(nullptr, EVENT_IRIS_ACTIVATED); - if (GameObject* iris = GetGameObject(DATA_IRIS)) - if (iris->GetPhaseMask() != 2) - iris->SetPhaseMask(2, true); - - if (player && player->IsAlive()) + if (player && player->IsAlive() && IsBossDone(DATA_MALYGOS)) player->CastSpell(player, SPELL_SUMMON_RED_DRAGON_BUDDY, true); } @@ -114,13 +106,16 @@ struct instance_eye_of_eternity : public InstanceScript InstanceScript::OnGameObjectCreate(gameobject); uint32 entry = gameobject->GetEntry(); - if ((entry == GO_IRIS_N || entry == GO_IRIS_H) && GetBossState(DATA_MALYGOS) == DONE) - gameobject->SetPhaseMask(2, true); - if (entry == GO_NEXUS_PLATFORM && GetBossState(DATA_MALYGOS) == DONE) + if (IsBossDone(DATA_MALYGOS)) { - gameobject->ModifyHealth(-int32(PLATFORM_DESTROY_DAMAGE)); - gameobject->EnableCollision(false); + if (entry == GO_IRIS_N || entry == GO_IRIS_H) + gameobject->SetPhaseMask(2, true); + else if (entry == GO_NEXUS_PLATFORM) + { + gameobject->SetDestructibleState(GO_DESTRUCTIBLE_DESTROYED, nullptr, true); + gameobject->EnableCollision(false); + } } } @@ -128,16 +123,6 @@ struct instance_eye_of_eternity : public InstanceScript { switch (type) { - case DATA_IRIS_ACTIVATED: - if (GetBossState(DATA_MALYGOS) == NOT_STARTED) - { - if (Creature* malygos = GetCreature(DATA_MALYGOS)) - { - if (Player* player = malygos->SelectNearestPlayer(250.0f)) - malygos->AI()->AttackStart(player); - } - } - break; case DATA_SET_IRIS_INACTIVE: { if (GameObject* iris = GetGameObject(DATA_IRIS)) @@ -204,15 +189,20 @@ struct instance_eye_of_eternity : public InstanceScript void ProcessEvent(WorldObject* /*unit*/, uint32 eventId) override { - if (eventId != EVENT_IRIS_ACTIVATED) - return; - - if (GameObject* platform = GetGameObject(DATA_NEXUS_PLATFORM)) + if (eventId == EVENT_IRIS_ACTIVATED) + { if (Creature* malygos = GetCreature(DATA_MALYGOS)) + if (Player* player = malygos->SelectNearestPlayer(250.0f)) + malygos->AI()->AttackStart(player); + } + else if (eventId == EVENT_DESTROY_PLATFORM) + { + if (GameObject* platform = GetGameObject(DATA_NEXUS_PLATFORM)) { - platform->ModifyHealth(-int32(PLATFORM_DESTROY_DAMAGE), malygos); + platform->SetDestructibleState(GO_DESTRUCTIBLE_DESTROYED, nullptr, true); platform->EnableCollision(false); } + } } bool CheckAchievementCriteriaMeet(uint32 criteria_id, Player const* source, Unit const* /*target*/, uint32 /*miscvalue1*/) override From cf92cfa59f7cdba21e3c2035b342aaafec85b4e9 Mon Sep 17 00:00:00 2001 From: Kitzunu <24550914+Kitzunu@users.noreply.github.com> Date: Sun, 22 Feb 2026 14:55:29 +0100 Subject: [PATCH 020/150] fix(Core/CLI): Replace fgetws with ReadConsoleW for Windows console UTF-8 input (#24725) Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> --- .../worldserver/CommandLine/CliRunnable.cpp | 30 +++++++++++++++---- 1 file changed, 25 insertions(+), 5 deletions(-) diff --git a/src/server/apps/worldserver/CommandLine/CliRunnable.cpp b/src/server/apps/worldserver/CommandLine/CliRunnable.cpp index 78b723a27..307bee1a5 100644 --- a/src/server/apps/worldserver/CommandLine/CliRunnable.cpp +++ b/src/server/apps/worldserver/CommandLine/CliRunnable.cpp @@ -25,7 +25,9 @@ #include "World.h" #include -#if AC_PLATFORM != AC_PLATFORM_WINDOWS +#if AC_PLATFORM == AC_PLATFORM_WINDOWS +#include +#else #include "Chat.h" #include "ChatCommand.h" #include @@ -108,6 +110,10 @@ int kb_hit_return() void CliThread() { #if AC_PLATFORM == AC_PLATFORM_WINDOWS + // Set console code pages to UTF-8 + SetConsoleCP(CP_UTF8); + SetConsoleOutputCP(CP_UTF8); + // print this here the first time // later it will be printed after command queue updates PrintCliPrefix(); @@ -134,6 +140,14 @@ void CliThread() fInfo.dwTimeout = 0; FlashWindowEx(&fInfo); } + + // Get console input handle once for reading commands + HANDLE hStdIn = GetStdHandle(STD_INPUT_HANDLE); + if (hStdIn == INVALID_HANDLE_VALUE) + { + LOG_ERROR("server.worldserver", "Failed to get console input handle"); + return; + } #endif ///- As long as the World is running (no World::m_stopEvent), get the command line and handle it @@ -145,12 +159,18 @@ void CliThread() #if AC_PLATFORM == AC_PLATFORM_WINDOWS wchar_t commandbuf[256]; - if (fgetws(commandbuf, sizeof(commandbuf), stdin)) + DWORD charsRead = 0; + + if (ReadConsoleW(hStdIn, commandbuf, sizeof(commandbuf) / sizeof(wchar_t) - 1, &charsRead, nullptr)) { - if (!WStrToUtf8(commandbuf, wcslen(commandbuf), command)) + if (charsRead > 0) { - PrintCliPrefix(); - continue; + commandbuf[charsRead] = L'\0'; + if (!WStrToUtf8(commandbuf, charsRead, command)) + { + PrintCliPrefix(); + continue; + } } } #else From 7137295d6939403d8adef1045f025eae42cbbcb7 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Sun, 22 Feb 2026 13:56:23 +0000 Subject: [PATCH 021/150] chore(DB): import pending files Referenced commit(s): 0759d4700094709d3af37102a5160c362de247ae --- .../rev_1771764309163193800.sql => db_world/2026_02_22_01.sql} | 1 + 1 file changed, 1 insertion(+) rename data/sql/updates/{pending_db_world/rev_1771764309163193800.sql => db_world/2026_02_22_01.sql} (74%) diff --git a/data/sql/updates/pending_db_world/rev_1771764309163193800.sql b/data/sql/updates/db_world/2026_02_22_01.sql similarity index 74% rename from data/sql/updates/pending_db_world/rev_1771764309163193800.sql rename to data/sql/updates/db_world/2026_02_22_01.sql index 797a96634..00c2f0c2a 100644 --- a/data/sql/updates/pending_db_world/rev_1771764309163193800.sql +++ b/data/sql/updates/db_world/2026_02_22_01.sql @@ -1,2 +1,3 @@ +-- DB update 2026_02_22_00 -> 2026_02_22_01 -- UPDATE `gameobject_template` SET `ScriptName` = '' WHERE `entry` IN (193958, 193960) AND `ScriptName` = 'go_the_focusing_iris'; From f7ab757970227cf64fd56ea751f5350167474767 Mon Sep 17 00:00:00 2001 From: sogladev Date: Sun, 22 Feb 2026 15:00:03 +0100 Subject: [PATCH 022/150] chore(Scripts/Ulduar): boss_kologarn_pit_kill_bunny (#24636) Co-authored-by: Andrew <47818697+Nyeriah@users.noreply.github.com> --- .../Northrend/Ulduar/Ulduar/boss_kologarn.cpp | 24 ++++++++++--------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_kologarn.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_kologarn.cpp index 99e5c4de9..a1854f5a1 100644 --- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_kologarn.cpp +++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_kologarn.cpp @@ -669,25 +669,29 @@ class spell_kologarn_focused_eyebeam : public SpellScript } }; +namespace pitKillBoundary { + static auto const boundaryIntersect = new BoundaryIntersectBoundary( + new RectangleBoundary(1782.0f, 1832.0f, -56.0f, 8.0f), + new ZRangeBoundary(400.0f, 439.0f) + ); +} + struct boss_kologarn_pit_kill_bunny : public NullCreatureAI { - boss_kologarn_pit_kill_bunny(Creature* creature) : NullCreatureAI(creature) { } + explicit boss_kologarn_pit_kill_bunny(Creature* creature) : NullCreatureAI(creature) { } void Reset() override { - RectangleBoundary* _boundaryXY = new RectangleBoundary(1782.0f, 1832.0f, -56.0f, 8.0f); - ZRangeBoundary* _boundaryZ = new ZRangeBoundary(400.0f, 439.0f); - _boundaryIntersect = new BoundaryIntersectBoundary(_boundaryXY, _boundaryZ); - - scheduler.Schedule(0s, [this](TaskContext context) + scheduler.CancelAll(); + scheduler.Schedule(0s, + [this](TaskContext context) { me->GetMap()->DoForAllPlayers([&](Player* player) { - if (_boundaryIntersect->IsWithinBoundary(player->GetPosition()) && !player->IsGameMaster()) - { + if (pitKillBoundary::boundaryIntersect->IsWithinBoundary(player->GetPosition()) && !player->IsGameMaster()) player->KillSelf(false); - } }); + context.Repeat(1s); }); } @@ -696,8 +700,6 @@ struct boss_kologarn_pit_kill_bunny : public NullCreatureAI { scheduler.Update(diff); } -private: - BoundaryIntersectBoundary const* _boundaryIntersect; }; // predicate function to select non main tank target From 7fadeb1141c48d552afd7c3bb40ef4b527272fa3 Mon Sep 17 00:00:00 2001 From: blinkysc <37940565+blinkysc@users.noreply.github.com> Date: Sun, 22 Feb 2026 11:06:47 -0600 Subject: [PATCH 023/150] fix(Core/Spells): Beacon of Light no longer copies target healing modifiers (#24796) Co-authored-by: blinkysc --- src/server/game/Entities/Unit/Unit.h | 9 ++++++++- src/server/game/Spells/Spell.cpp | 15 +++++++++++++++ src/server/game/Spells/Spell.h | 2 ++ src/server/game/Spells/SpellEffects.cpp | 4 ++++ src/server/scripts/Spells/spell_paladin.cpp | 5 ++++- 5 files changed, 33 insertions(+), 2 deletions(-) diff --git a/src/server/game/Entities/Unit/Unit.h b/src/server/game/Entities/Unit/Unit.h index 96e99ab98..6be903f8b 100644 --- a/src/server/game/Entities/Unit/Unit.h +++ b/src/server/game/Entities/Unit/Unit.h @@ -386,6 +386,7 @@ private: Unit* const m_healer; Unit* const m_target; uint32 m_heal; + uint32 m_healBeforeTakenMods; uint32 m_effectiveHeal; uint32 m_absorb; SpellInfo const* const m_spellInfo; @@ -393,7 +394,7 @@ private: uint32 m_hitMask; public: explicit HealInfo(Unit* _healer, Unit* _target, uint32 _heal, SpellInfo const* _spellInfo, SpellSchoolMask _schoolMask) - : m_healer(_healer), m_target(_target), m_heal(_heal), m_spellInfo(_spellInfo), m_schoolMask(_schoolMask), m_hitMask(0) + : m_healer(_healer), m_target(_target), m_heal(_heal), m_healBeforeTakenMods(0), m_spellInfo(_spellInfo), m_schoolMask(_schoolMask), m_hitMask(0) { m_absorb = 0; m_effectiveHeal = 0; @@ -414,6 +415,11 @@ public: m_heal = amount; } + void SetHealBeforeTakenMods(uint32 amount) + { + m_healBeforeTakenMods = amount; + } + void SetEffectiveHeal(uint32 amount) { m_effectiveHeal = amount; @@ -422,6 +428,7 @@ public: [[nodiscard]] Unit* GetHealer() const { return m_healer; } [[nodiscard]] Unit* GetTarget() const { return m_target; } [[nodiscard]] uint32 GetHeal() const { return m_heal; } + [[nodiscard]] uint32 GetHealBeforeTakenMods() const { return m_healBeforeTakenMods; } [[nodiscard]] uint32 GetEffectiveHeal() const { return m_effectiveHeal; } [[nodiscard]] uint32 GetAbsorb() const { return m_absorb; } [[nodiscard]] SpellInfo const* GetSpellInfo() const { return m_spellInfo; }; diff --git a/src/server/game/Spells/Spell.cpp b/src/server/game/Spells/Spell.cpp index e8fe0a346..fb9b33958 100644 --- a/src/server/game/Spells/Spell.cpp +++ b/src/server/game/Spells/Spell.cpp @@ -649,6 +649,7 @@ Spell::Spell(Unit* caster, SpellInfo const* info, TriggerCastFlags triggerFlags, m_diminishGroup = DIMINISHING_NONE; m_damage = 0; m_healing = 0; + m_damageBeforeTakenMods = 0; m_procAttacker = 0; m_procVictim = 0; m_procEx = 0; @@ -2337,6 +2338,7 @@ void Spell::AddUnitTarget(Unit* target, uint32 effectMask, bool checkIfValid /*= targetInfo.processed = false; // Effects not apply on target targetInfo.alive = target->IsAlive(); targetInfo.damage = 0; + targetInfo.damageBeforeTakenMods = 0; targetInfo.crit = false; targetInfo.scaleAura = false; if (m_auraScaleMask && targetInfo.effectMask == m_auraScaleMask && m_caster != target) @@ -2712,6 +2714,17 @@ void Spell::DoAllEffectOnTarget(TargetInfo* target) HealInfo healInfo(caster, unitTarget, addhealth, m_spellInfo, m_spellInfo->GetSchoolMask()); + // Heal amount before SpellHealingBonusTaken, used by Beacon of Light + if (target->damageBeforeTakenMods != 0) + { + uint32 healBeforeTakenMods = uint32(-target->damageBeforeTakenMods); + if (crit) + healBeforeTakenMods = Unit::SpellCriticalHealingBonus(caster, m_spellInfo, healBeforeTakenMods, nullptr); + healInfo.SetHealBeforeTakenMods(healBeforeTakenMods); + } + else + healInfo.SetHealBeforeTakenMods(addhealth); + // Set hitMask based on crit if (crit) healInfo.AddHitMask(PROC_HIT_CRITICAL); @@ -8297,6 +8310,7 @@ void Spell::DoAllEffectOnLaunchTarget(TargetInfo& targetInfo, float* multiplier) { m_damage = 0; m_healing = 0; + m_damageBeforeTakenMods = 0; HandleEffects(unit, nullptr, nullptr, i, SPELL_EFFECT_HANDLE_LAUNCH_TARGET); @@ -8322,6 +8336,7 @@ void Spell::DoAllEffectOnLaunchTarget(TargetInfo& targetInfo, float* multiplier) m_damageMultipliers[i] *= multiplier[i]; } targetInfo.damage += m_damage; + targetInfo.damageBeforeTakenMods += m_damageBeforeTakenMods; } } diff --git a/src/server/game/Spells/Spell.h b/src/server/game/Spells/Spell.h index ea9fe3630..cb3f89540 100644 --- a/src/server/game/Spells/Spell.h +++ b/src/server/game/Spells/Spell.h @@ -273,6 +273,7 @@ struct TargetInfo bool crit:1; bool scaleAura:1; int32 damage; + int32 damageBeforeTakenMods; }; static const uint32 SPELL_INTERRUPT_NONPLAYER = 32747; @@ -683,6 +684,7 @@ public: // Damage and healing in effects need just calculate int32 m_damage; // Damge in effects count here int32 m_healing; // Healing in effects count here + int32 m_damageBeforeTakenMods; // ****************************************** // Spell trigger system diff --git a/src/server/game/Spells/SpellEffects.cpp b/src/server/game/Spells/SpellEffects.cpp index 5aff04864..730dc9859 100644 --- a/src/server/game/Spells/SpellEffects.cpp +++ b/src/server/game/Spells/SpellEffects.cpp @@ -1557,11 +1557,13 @@ void Spell::EffectHeal(SpellEffIndex effIndex) else if (m_spellInfo->SpellFamilyName == SPELLFAMILY_DEATHKNIGHT && m_spellInfo->SpellFamilyFlags[0] & 0x00080000) { addhealth = caster->SpellHealingBonusDone(unitTarget, m_spellInfo, int32(caster->CountPctFromMaxHealth(damage)), HEAL, effIndex); + m_damageBeforeTakenMods -= addhealth; addhealth = unitTarget->SpellHealingBonusTaken(caster, m_spellInfo, addhealth, HEAL); } else if (m_spellInfo->Id != 33778) // not lifebloom { addhealth = caster->SpellHealingBonusDone(unitTarget, m_spellInfo, addhealth, HEAL, effIndex); + m_damageBeforeTakenMods -= addhealth; addhealth = unitTarget->SpellHealingBonusTaken(caster, m_spellInfo, addhealth, HEAL); } @@ -1593,6 +1595,7 @@ void Spell::EffectHealPct(SpellEffIndex effIndex) return; uint32 heal = m_originalCaster->SpellHealingBonusDone(unitTarget, m_spellInfo, unitTarget->CountPctFromMaxHealth(damage), HEAL, effIndex); + m_damageBeforeTakenMods -= heal; heal = unitTarget->SpellHealingBonusTaken(m_originalCaster, m_spellInfo, heal, HEAL); m_damage -= heal; @@ -1611,6 +1614,7 @@ void Spell::EffectHealMechanical(SpellEffIndex effIndex) return; uint32 heal = m_originalCaster->SpellHealingBonusDone(unitTarget, m_spellInfo, uint32(damage), HEAL, effIndex); + m_damageBeforeTakenMods -= heal; m_damage -= unitTarget->SpellHealingBonusTaken(m_originalCaster, m_spellInfo, heal, HEAL); } diff --git a/src/server/scripts/Spells/spell_paladin.cpp b/src/server/scripts/Spells/spell_paladin.cpp index 163899a46..0e5f3b48a 100644 --- a/src/server/scripts/Spells/spell_paladin.cpp +++ b/src/server/scripts/Spells/spell_paladin.cpp @@ -2148,7 +2148,10 @@ class spell_pal_light_s_beacon : public AuraScript // Holy Light heals for 100%, Flash of Light heals for 50% uint32 healSpellId = procSpell->IsRankOf(sSpellMgr->AssertSpellInfo(SPELL_PALADIN_HOLY_LIGHT_R1)) ? SPELL_PALADIN_BEACON_OF_LIGHT_FLASH : SPELL_PALADIN_BEACON_OF_LIGHT_HOLY; - int32 heal = CalculatePct(healInfo->GetHeal(), aurEff->GetAmount()); + + // Use heal amount before target-specific modifiers to avoid copying them + uint32 healAmount = healInfo->GetHealBeforeTakenMods(); + int32 heal = CalculatePct(healAmount, aurEff->GetAmount()); Unit* beaconTarget = GetCaster(); if (!beaconTarget || !beaconTarget->HasAura(SPELL_PALADIN_BEACON_OF_LIGHT_AURA, eventInfo.GetActor()->GetGUID())) From ff990a42abbbf54def4d6a8fbce29a4b2d63cef6 Mon Sep 17 00:00:00 2001 From: blinkysc <37940565+blinkysc@users.noreply.github.com> Date: Sun, 22 Feb 2026 11:07:18 -0600 Subject: [PATCH 024/150] fix(Core/Spells): Implement Honor Among Thieves spell scripts (#24799) Co-authored-by: blinkysc Co-authored-by: ccrs --- .../pending_db_world/rev_1771742446580585.sql | 7 ++ .../game/Spells/SpellInfoCorrections.cpp | 12 +-- src/server/scripts/Spells/spell_rogue.cpp | 87 ++++++++++++++++++- 3 files changed, 99 insertions(+), 7 deletions(-) create mode 100644 data/sql/updates/pending_db_world/rev_1771742446580585.sql diff --git a/data/sql/updates/pending_db_world/rev_1771742446580585.sql b/data/sql/updates/pending_db_world/rev_1771742446580585.sql new file mode 100644 index 000000000..8824f4494 --- /dev/null +++ b/data/sql/updates/pending_db_world/rev_1771742446580585.sql @@ -0,0 +1,7 @@ +-- Honor Among Thieves spell script registration +DELETE FROM `spell_script_names` WHERE `spell_id` IN (51698, 51700, 51701, 52916); +INSERT INTO `spell_script_names` (`spell_id`, `ScriptName`) VALUES +(51698, 'spell_rog_honor_among_thieves'), +(51700, 'spell_rog_honor_among_thieves'), +(51701, 'spell_rog_honor_among_thieves'), +(52916, 'spell_rog_honor_among_thieves_proc'); diff --git a/src/server/game/Spells/SpellInfoCorrections.cpp b/src/server/game/Spells/SpellInfoCorrections.cpp index 86bd0acc6..dc5218fba 100644 --- a/src/server/game/Spells/SpellInfoCorrections.cpp +++ b/src/server/game/Spells/SpellInfoCorrections.cpp @@ -713,12 +713,6 @@ void SpellMgr::LoadSpellInfoCorrections() spellInfo->Effects[EFFECT_0].Effect = SPELL_EFFECT_SCRIPT_EFFECT; }); - // Honor Among Thieves - ApplySpellFix({ 51698, 51700, 51701 }, [](SpellInfo* spellInfo) - { - spellInfo->Effects[EFFECT_0].TriggerSpell = 51699; - }); - ApplySpellFix({ 5171, // Slice and Dice 6774 // Slice and Dice @@ -4388,6 +4382,12 @@ void SpellMgr::LoadSpellInfoCorrections() spellInfo->AttributesEx4 |= SPELL_ATTR4_NOT_IN_ARENA_OR_RATED_BATTLEGROUND; }); + // Honor Among Thieves - allow area aura from different casters to coexist + ApplySpellFix({ 51698, 51700, 51701 }, [](SpellInfo* spellInfo) + { + spellInfo->AttributesEx3 |= SPELL_ATTR3_DOT_STACKING_RULE; + }); + // Absorb Life ApplySpellFix({ 34239 }, [](SpellInfo* spellInfo) { diff --git a/src/server/scripts/Spells/spell_rogue.cpp b/src/server/scripts/Spells/spell_rogue.cpp index 925bd78c4..72aeb1270 100644 --- a/src/server/scripts/Spells/spell_rogue.cpp +++ b/src/server/scripts/Spells/spell_rogue.cpp @@ -51,7 +51,9 @@ enum RogueSpells SPELL_ROGUE_TURN_THE_TABLES_R1 = 52910, SPELL_ROGUE_TURN_THE_TABLES_R2 = 52914, SPELL_ROGUE_TURN_THE_TABLES_R3 = 52915, - SPELL_ROGUE_OVERKILL_TRIGGERED = 58427 + SPELL_ROGUE_OVERKILL_TRIGGERED = 58427, + SPELL_ROGUE_HONOR_AMONG_THIEVES_PROC = 52916, + SPELL_ROGUE_HONOR_AMONG_THIEVES_TRIGGERED = 51699 }; enum RogueSpellIcons @@ -932,6 +934,87 @@ class spell_rog_setup : public AuraScript } }; +// 51698, 51700, 51701 - Honor Among Thieves +class spell_rog_honor_among_thieves : public AuraScript +{ + PrepareAuraScript(spell_rog_honor_among_thieves); + + bool Validate(SpellInfo const* /*spellInfo*/) override + { + return ValidateSpellInfo({ SPELL_ROGUE_HONOR_AMONG_THIEVES_TRIGGERED }); + } + + bool CheckProc(ProcEventInfo& /*eventInfo*/) + { + Unit* caster = GetCaster(); + if (!caster || caster->HasAura(SPELL_ROGUE_HONOR_AMONG_THIEVES_TRIGGERED)) + return false; + + return true; + } + + void HandleProc(AuraEffect const* aurEff, ProcEventInfo& /*eventInfo*/) + { + PreventDefaultAction(); + + Unit* caster = GetCaster(); + if (!caster) + return; + + Unit* target = GetTarget(); + target->CastSpell(target, GetSpellInfo()->Effects[aurEff->GetEffIndex()].TriggerSpell, true, nullptr, aurEff, caster->GetGUID()); + } + + void Register() override + { + DoCheckProc += AuraCheckProcFn(spell_rog_honor_among_thieves::CheckProc); + OnEffectProc += AuraEffectProcFn(spell_rog_honor_among_thieves::HandleProc, EFFECT_0, SPELL_AURA_PROC_TRIGGER_SPELL); + } +}; + +// 52916 - Honor Among Thieves (Proc) +class spell_rog_honor_among_thieves_proc : public SpellScript +{ + PrepareSpellScript(spell_rog_honor_among_thieves_proc); + + void FilterTargets(std::list& targets) + { + targets.clear(); + + Unit* target = GetOriginalCaster(); + if (!target) + return; + + targets.push_back(target); + } + + void Register() override + { + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_rog_honor_among_thieves_proc::FilterTargets, EFFECT_0, TARGET_UNIT_CASTER_AREA_PARTY); + } +}; + +// 52916 - Honor Among Thieves (Proc Aura) +class spell_rog_honor_among_thieves_proc_aura : public AuraScript +{ + PrepareAuraScript(spell_rog_honor_among_thieves_proc_aura); + + void HandleEffectApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + { + Unit* caster = GetCaster(); + if (!caster) + return; + + if (Player* player = caster->ToPlayer()) + player->CastSpell(static_cast(nullptr), SPELL_ROGUE_HONOR_AMONG_THIEVES_TRIGGERED, true); + } + + void Register() override + { + AfterEffectApply += AuraEffectApplyFn(spell_rog_honor_among_thieves_proc_aura::HandleEffectApply, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL_OR_REAPPLY_MASK); + } +}; + // -51627 - Turn the Tables class spell_rog_turn_the_tables : public AuraScript { @@ -996,6 +1079,8 @@ void AddSC_rogue_spell_scripts() RegisterSpellScript(spell_rog_deadly_brew); RegisterSpellScript(spell_rog_quick_recovery); RegisterSpellScript(spell_rog_setup); + RegisterSpellScript(spell_rog_honor_among_thieves); + RegisterSpellAndAuraScriptPair(spell_rog_honor_among_thieves_proc, spell_rog_honor_among_thieves_proc_aura); RegisterSpellScript(spell_rog_turn_the_tables); RegisterSpellScript(spell_rog_turn_the_tables_proc); } From e281f10b5b41e18605d79e7bd5abca584af2def3 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Sun, 22 Feb 2026 17:23:17 +0000 Subject: [PATCH 025/150] chore(DB): import pending files Referenced commit(s): 7fadeb1141c48d552afd7c3bb40ef4b527272fa3 --- .../rev_1771742446580585.sql => db_world/2026_02_22_02.sql} | 1 + 1 file changed, 1 insertion(+) rename data/sql/updates/{pending_db_world/rev_1771742446580585.sql => db_world/2026_02_22_02.sql} (89%) diff --git a/data/sql/updates/pending_db_world/rev_1771742446580585.sql b/data/sql/updates/db_world/2026_02_22_02.sql similarity index 89% rename from data/sql/updates/pending_db_world/rev_1771742446580585.sql rename to data/sql/updates/db_world/2026_02_22_02.sql index 8824f4494..46dad52e1 100644 --- a/data/sql/updates/pending_db_world/rev_1771742446580585.sql +++ b/data/sql/updates/db_world/2026_02_22_02.sql @@ -1,3 +1,4 @@ +-- DB update 2026_02_22_01 -> 2026_02_22_02 -- Honor Among Thieves spell script registration DELETE FROM `spell_script_names` WHERE `spell_id` IN (51698, 51700, 51701, 52916); INSERT INTO `spell_script_names` (`spell_id`, `ScriptName`) VALUES From 2990f13840ca935359c1812ec7bfe44b6aac223d Mon Sep 17 00:00:00 2001 From: blinkysc <37940565+blinkysc@users.noreply.github.com> Date: Sun, 22 Feb 2026 11:27:54 -0600 Subject: [PATCH 026/150] fix(Core/Spells): Prevent extra attack abilities from chain-proccing (#24806) Co-authored-by: blinkysc Co-authored-by: trickerer --- .../game/Spells/Auras/SpellAuraEffects.cpp | 23 +++ src/test/mocks/ProcChanceTestHelper.h | 39 +++++ .../game/Spells/ExtraAttackChainProcTest.cpp | 149 ++++++++++++++++++ 3 files changed, 211 insertions(+) create mode 100644 src/test/server/game/Spells/ExtraAttackChainProcTest.cpp diff --git a/src/server/game/Spells/Auras/SpellAuraEffects.cpp b/src/server/game/Spells/Auras/SpellAuraEffects.cpp index ef713a32d..775aab3d5 100644 --- a/src/server/game/Spells/Auras/SpellAuraEffects.cpp +++ b/src/server/game/Spells/Auras/SpellAuraEffects.cpp @@ -1239,6 +1239,29 @@ bool AuraEffect::CheckEffectProc(AuraApplication* aurApp, ProcEventInfo& eventIn if (GetCasterGUID() != eventInfo.GetActor()->GetGUID()) return false; break; + case SPELL_AURA_PROC_TRIGGER_SPELL: + case SPELL_AURA_PROC_TRIGGER_SPELL_WITH_VALUE: + { + // Don't proc extra attacks while already processing extra attack spell + uint32 triggerSpellId = m_spellInfo->Effects[GetEffIndex()].TriggerSpell; + if (SpellInfo const* triggeredSpellInfo = sSpellMgr->GetSpellInfo(triggerSpellId)) + { + if (triggeredSpellInfo->HasEffect(SPELL_EFFECT_ADD_EXTRA_ATTACKS)) + { + uint32 lastExtraAttackSpell = eventInfo.GetActor()->GetLastExtraAttackSpell(); + + // Patch 1.12.0(?) extra attack abilities can no longer chain proc themselves + if (lastExtraAttackSpell == triggerSpellId) + return false; + + // Patch 2.2.0 Sword Specialization (Warrior, Rogue) extra attack can no longer proc additional extra attacks + // 3.3.5 Sword Specialization (Warrior), Hack and Slash (Rogue) + if (lastExtraAttackSpell == SPELL_SWORD_SPECIALIZATION || lastExtraAttackSpell == SPELL_HACK_AND_SLASH) + return false; + } + } + break; + } default: break; } diff --git a/src/test/mocks/ProcChanceTestHelper.h b/src/test/mocks/ProcChanceTestHelper.h index 32a3dac98..41e0dfa38 100644 --- a/src/test/mocks/ProcChanceTestHelper.h +++ b/src/test/mocks/ProcChanceTestHelper.h @@ -282,6 +282,45 @@ public: return false; // Allow proc } + // ============================================================================= + // Extra Attack Chain-Proc Prevention - simulates SpellAuraEffects.cpp:1245-1261 + // ============================================================================= + + /** + * @brief Configuration for simulating extra attack chain-proc prevention + */ + struct ExtraAttackProcConfig + { + bool triggeredSpellHasExtraAttacks = false; // triggeredSpellInfo->HasEffect(SPELL_EFFECT_ADD_EXTRA_ATTACKS) + uint32 triggerSpellId = 0; // m_spellInfo->Effects[GetEffIndex()].TriggerSpell + uint32 lastExtraAttackSpell = 0; // eventInfo.GetActor()->GetLastExtraAttackSpell() + }; + + /** + * @brief Simulate extra attack chain-proc prevention from CheckEffectProc + * Returns true if proc should be blocked + * + * @param config Extra attack proc configuration + * @return true if proc should be blocked + */ + static bool ShouldBlockExtraAttackChainProc(ExtraAttackProcConfig const& config) + { + // Only applies when the triggered spell grants extra attacks + if (!config.triggeredSpellHasExtraAttacks) + return false; + + // Patch 1.12.0(?) extra attack abilities can no longer chain proc themselves + if (config.lastExtraAttackSpell == config.triggerSpellId) + return true; + + // Patch 2.2.0 Sword Specialization (Warrior, Rogue) extra attack can no longer proc additional extra attacks + // 3.3.5 Sword Specialization (Warrior), Hack and Slash (Rogue) + if (config.lastExtraAttackSpell == 16459 || config.lastExtraAttackSpell == 66923) + return true; + + return false; + } + // ============================================================================= // DisableEffectsMask - simulates SpellAuras.cpp:2244-2258 // ============================================================================= diff --git a/src/test/server/game/Spells/ExtraAttackChainProcTest.cpp b/src/test/server/game/Spells/ExtraAttackChainProcTest.cpp new file mode 100644 index 000000000..50e33768f --- /dev/null +++ b/src/test/server/game/Spells/ExtraAttackChainProcTest.cpp @@ -0,0 +1,149 @@ +/* + * This file is part of the AzerothCore Project. See AUTHORS file for Copyright information + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along + * with this program. If not, see . + */ + +/** + * @file ExtraAttackChainProcTest.cpp + * @brief Unit tests for extra attack chain-proc prevention + * + * Tests the logic from SpellAuraEffects.cpp:1245-1261 (CheckEffectProc): + * - Self-chain prevention (same extra attack spell can't proc itself) + * - Cross-chain prevention (Sword Specialization / Hack and Slash block all extra attack procs) + * - Non-blacklisted extra attack spells allow cross-proccing + * - Non-extra-attack procs are unaffected by the guard + */ + +#include "ProcChanceTestHelper.h" +#include "gtest/gtest.h" + +using namespace testing; + +// Use existing enum from Unit.h: SPELL_SWORD_SPECIALIZATIONIALIZATION (16459), SPELL_HACK_AND_SLASH (66923) +constexpr uint32 SPELL_RECKONING = 32746; // Reckoning (Paladin) +constexpr uint32 SPELL_HAND_OF_JUSTICE = 15601; // Hand of Justice extra attack + +class ExtraAttackChainProcTest : public ::testing::Test +{ +protected: + ProcChanceTestHelper::ExtraAttackProcConfig MakeConfig( + bool hasExtraAttacks, uint32 triggerSpellId, uint32 lastExtraAttack) + { + ProcChanceTestHelper::ExtraAttackProcConfig config; + config.triggeredSpellHasExtraAttacks = hasExtraAttacks; + config.triggerSpellId = triggerSpellId; + config.lastExtraAttackSpell = lastExtraAttack; + return config; + } +}; + +// ============================================================================= +// Normal proc (no extra attack in progress) +// ============================================================================= + +TEST_F(ExtraAttackChainProcTest, NormalProc_AllowedWhenNoExtraAttackInProgress) +{ + // lastExtraAttackSpell == 0 means no extra attack is executing + auto config = MakeConfig(true, SPELL_SWORD_SPECIALIZATION, 0); + + EXPECT_FALSE(ProcChanceTestHelper::ShouldBlockExtraAttackChainProc(config)) + << "Extra attack proc should be allowed when no extra attack is in progress"; +} + +// ============================================================================= +// Self-chain prevention +// ============================================================================= + +TEST_F(ExtraAttackChainProcTest, SelfChain_BlockedWhenSameSpell) +{ + // Sword Spec trying to proc during its own extra attack + auto config = MakeConfig(true, SPELL_SWORD_SPECIALIZATION, SPELL_SWORD_SPECIALIZATION); + + EXPECT_TRUE(ProcChanceTestHelper::ShouldBlockExtraAttackChainProc(config)) + << "Extra attack spell should not chain-proc itself"; +} + +// ============================================================================= +// Cross-chain prevention (blacklisted spells) +// ============================================================================= + +TEST_F(ExtraAttackChainProcTest, CrossChain_BlockedBySwordSpecialization) +{ + // Reckoning trying to proc during Sword Spec extra attack + auto config = MakeConfig(true, SPELL_RECKONING, SPELL_SWORD_SPECIALIZATION); + + EXPECT_TRUE(ProcChanceTestHelper::ShouldBlockExtraAttackChainProc(config)) + << "Sword Specialization extra attack should block all other extra attack procs"; +} + +TEST_F(ExtraAttackChainProcTest, CrossChain_BlockedByHackAndSlash) +{ + // Reckoning trying to proc during Hack and Slash extra attack + auto config = MakeConfig(true, SPELL_RECKONING, SPELL_HACK_AND_SLASH); + + EXPECT_TRUE(ProcChanceTestHelper::ShouldBlockExtraAttackChainProc(config)) + << "Hack and Slash extra attack should block all other extra attack procs"; +} + +// ============================================================================= +// Non-blacklisted extra attacks allow cross-proccing +// ============================================================================= + +TEST_F(ExtraAttackChainProcTest, DifferentExtraAttack_AllowedWhenNotBlacklisted) +{ + // Sword Spec trying to proc during Hand of Justice extra attack + // Hand of Justice (15601) is not blacklisted, so cross-proc is allowed + auto config = MakeConfig(true, SPELL_SWORD_SPECIALIZATION, SPELL_HAND_OF_JUSTICE); + + EXPECT_FALSE(ProcChanceTestHelper::ShouldBlockExtraAttackChainProc(config)) + << "Non-blacklisted extra attack spells should allow cross-proccing"; +} + +// ============================================================================= +// Non-extra-attack procs unaffected +// ============================================================================= + +TEST_F(ExtraAttackChainProcTest, NonExtraAttackProc_UnaffectedByExtraAttackState) +{ + // A proc that does NOT grant extra attacks should never be blocked, + // even during Sword Spec extra attack + auto config = MakeConfig(false, 12345, SPELL_SWORD_SPECIALIZATION); + + EXPECT_FALSE(ProcChanceTestHelper::ShouldBlockExtraAttackChainProc(config)) + << "Non-extra-attack procs should be unaffected by extra attack state"; +} + +// ============================================================================= +// Real spell scenarios +// ============================================================================= + +TEST_F(ExtraAttackChainProcTest, Reckoning_SelfChainBlocked) +{ + // Reckoning (32746) trying to proc during its own extra attack + auto config = MakeConfig(true, SPELL_RECKONING, SPELL_RECKONING); + + EXPECT_TRUE(ProcChanceTestHelper::ShouldBlockExtraAttackChainProc(config)) + << "Reckoning should not chain-proc itself"; +} + +TEST_F(ExtraAttackChainProcTest, Reckoning_AllowedDuringHandOfJustice) +{ + // Reckoning trying to proc during Hand of Justice extra attack + // Hand of Justice is not blacklisted, so Reckoning is allowed + auto config = MakeConfig(true, SPELL_RECKONING, SPELL_HAND_OF_JUSTICE); + + EXPECT_FALSE(ProcChanceTestHelper::ShouldBlockExtraAttackChainProc(config)) + << "Reckoning should be allowed during Hand of Justice extra attack"; +} From fe0222cbdd108ced056ead5992b109702f3a5cdc Mon Sep 17 00:00:00 2001 From: Gultask <100873791+Gultask@users.noreply.github.com> Date: Sun, 22 Feb 2026 14:30:50 -0300 Subject: [PATCH 027/150] fix(DB/Loot): Tweak some Loot Conditions for profession drops (#24809) --- .../pending_db_world/rev_1771781260483912800.sql | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 data/sql/updates/pending_db_world/rev_1771781260483912800.sql diff --git a/data/sql/updates/pending_db_world/rev_1771781260483912800.sql b/data/sql/updates/pending_db_world/rev_1771781260483912800.sql new file mode 100644 index 000000000..f3625f7d9 --- /dev/null +++ b/data/sql/updates/pending_db_world/rev_1771781260483912800.sql @@ -0,0 +1,16 @@ +-- +DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId` = 10 AND `SourceGroup` IN (1267174, 1266870, 1267579, 1268083) AND `SourceEntry` = 43876 AND `ConditionTypeOrReference` = 7 AND `ConditionValue1` = 197; +INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `SourceId`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionTarget`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `NegativeCondition`, `ErrorType`, `ErrorTextId`, `ScriptName`, `Comment`) VALUES +(10, 1266870, 43876, 0, 0, 7, 0, 197, 1, 0, 0, 0, 0, '', 'Player must have Tailoring Skill to loot A Guide to Northern Cloth Scavenging'), +(10, 1267174, 43876, 0, 0, 7, 0, 197, 1, 0, 0, 0, 0, '', 'Player must have Tailoring Skill to loot A Guide to Northern Cloth Scavenging'), +(10, 1267579, 43876, 0, 0, 7, 0, 197, 1, 0, 0, 0, 0, '', 'Player must have Tailoring Skill to loot A Guide to Northern Cloth Scavenging'), +(10, 1268083, 43876, 0, 0, 7, 0, 197, 1, 0, 0, 0, 0, '', 'Player must have Tailoring Skill to loot A Guide to Northern Cloth Scavenging'); + +DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId` = 10 AND `SourceGroup` IN (1260002) AND `SourceEntry` IN (42172,42173,42175,42176,42177,42178) AND `ConditionTypeOrReference` = 1 AND `ConditionValue1` IN (55993,55994,55996,55998,55997,55999); +INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `SourceId`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionTarget`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `NegativeCondition`, `ErrorType`, `ErrorTextId`, `ScriptName`, `Comment`) VALUES +(10, 1260002, 42172, 0, 0, 1, 0, 55993, 0, 0, 1, 0, 0, '', 'Player must not know this Tailoring pattern already'), +(10, 1260002, 42173, 0, 0, 1, 0, 55994, 0, 0, 1, 0, 0, '', 'Player must not know this Tailoring pattern already'), +(10, 1260002, 42175, 0, 0, 1, 0, 55996, 0, 0, 1, 0, 0, '', 'Player must not know this Tailoring pattern already'), +(10, 1260002, 42176, 0, 0, 1, 0, 55998, 0, 0, 1, 0, 0, '', 'Player must not know this Tailoring pattern already'), +(10, 1260002, 42177, 0, 0, 1, 0, 55997, 0, 0, 1, 0, 0, '', 'Player must not know this Tailoring pattern already'), +(10, 1260002, 42178, 0, 0, 1, 0, 55999, 0, 0, 1, 0, 0, '', 'Player must not know this Tailoring pattern already'); From c2e595abb9d181eff13a10e3800f0f0748cdcc22 Mon Sep 17 00:00:00 2001 From: Gultask <100873791+Gultask@users.noreply.github.com> Date: Sun, 22 Feb 2026 15:10:43 -0300 Subject: [PATCH 028/150] fix(DB): Tweak some Loot Conditions for profession drops II (#24810) --- data/sql/updates/pending_db_world/rev_1771782375896428400.sql | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 data/sql/updates/pending_db_world/rev_1771782375896428400.sql diff --git a/data/sql/updates/pending_db_world/rev_1771782375896428400.sql b/data/sql/updates/pending_db_world/rev_1771782375896428400.sql new file mode 100644 index 000000000..a30ea5de5 --- /dev/null +++ b/data/sql/updates/pending_db_world/rev_1771782375896428400.sql @@ -0,0 +1,2 @@ +-- +UPDATE `conditions` SET `ConditionTypeOrReference` = 25 WHERE `SourceTypeOrReferenceId` = 10 AND `SourceGroup` IN (1260002) AND `SourceEntry` IN (42172,42173,42175,42176,42177,42178) AND `ConditionTypeOrReference` = 1 AND `ConditionValue1` IN (55993,55994,55996,55998,55997,55999); From 7b5f56f76297d1b54fda42457a08b7f22e990c13 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Sun, 22 Feb 2026 18:14:03 +0000 Subject: [PATCH 029/150] chore(DB): import pending files Referenced commit(s): ff990a42abbbf54def4d6a8fbce29a4b2d63cef6 --- .../rev_1771781260483912800.sql => db_world/2026_02_22_03.sql} | 1 + .../rev_1771782375896428400.sql => db_world/2026_02_22_04.sql} | 1 + 2 files changed, 2 insertions(+) rename data/sql/updates/{pending_db_world/rev_1771781260483912800.sql => db_world/2026_02_22_03.sql} (98%) rename data/sql/updates/{pending_db_world/rev_1771782375896428400.sql => db_world/2026_02_22_04.sql} (86%) diff --git a/data/sql/updates/pending_db_world/rev_1771781260483912800.sql b/data/sql/updates/db_world/2026_02_22_03.sql similarity index 98% rename from data/sql/updates/pending_db_world/rev_1771781260483912800.sql rename to data/sql/updates/db_world/2026_02_22_03.sql index f3625f7d9..9308306e9 100644 --- a/data/sql/updates/pending_db_world/rev_1771781260483912800.sql +++ b/data/sql/updates/db_world/2026_02_22_03.sql @@ -1,3 +1,4 @@ +-- DB update 2026_02_22_02 -> 2026_02_22_03 -- DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId` = 10 AND `SourceGroup` IN (1267174, 1266870, 1267579, 1268083) AND `SourceEntry` = 43876 AND `ConditionTypeOrReference` = 7 AND `ConditionValue1` = 197; INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `SourceId`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionTarget`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `NegativeCondition`, `ErrorType`, `ErrorTextId`, `ScriptName`, `Comment`) VALUES diff --git a/data/sql/updates/pending_db_world/rev_1771782375896428400.sql b/data/sql/updates/db_world/2026_02_22_04.sql similarity index 86% rename from data/sql/updates/pending_db_world/rev_1771782375896428400.sql rename to data/sql/updates/db_world/2026_02_22_04.sql index a30ea5de5..67f5705a4 100644 --- a/data/sql/updates/pending_db_world/rev_1771782375896428400.sql +++ b/data/sql/updates/db_world/2026_02_22_04.sql @@ -1,2 +1,3 @@ +-- DB update 2026_02_22_03 -> 2026_02_22_04 -- UPDATE `conditions` SET `ConditionTypeOrReference` = 25 WHERE `SourceTypeOrReferenceId` = 10 AND `SourceGroup` IN (1260002) AND `SourceEntry` IN (42172,42173,42175,42176,42177,42178) AND `ConditionTypeOrReference` = 1 AND `ConditionValue1` IN (55993,55994,55996,55998,55997,55999); From 3931993109a61e5c2d79897b7fedcc201f496d99 Mon Sep 17 00:00:00 2001 From: trauntrow <84481188+trauntrow@users.noreply.github.com> Date: Sun, 22 Feb 2026 13:30:35 -0500 Subject: [PATCH 030/150] fix(DB/SAI): Homing Robot OOX-17/TN fix waypoints and aura (#24769) --- .../rev_1771548049716998200.sql | 37 +++++++++++++++++++ 1 file changed, 37 insertions(+) create mode 100644 data/sql/updates/pending_db_world/rev_1771548049716998200.sql diff --git a/data/sql/updates/pending_db_world/rev_1771548049716998200.sql b/data/sql/updates/pending_db_world/rev_1771548049716998200.sql new file mode 100644 index 000000000..987817229 --- /dev/null +++ b/data/sql/updates/pending_db_world/rev_1771548049716998200.sql @@ -0,0 +1,37 @@ +UPDATE `creature_template` SET `AIName` = 'SmartAI' WHERE `entry` = 7784; + +DELETE FROM `smart_scripts` WHERE (`entryorguid` = 7784) AND (`source_type` = 0) AND (`id` IN (7)); +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 +(7784, 0, 7, 0, 11, 0, 100, 512, 0, 0, 0, 0, 0, 0, 28, 68499, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Homing Robot OOX-17/TN - On Respawn - Remove Aura \'OOX Lift Off\''); + +-- Update waypoints with sniffed data +DELETE FROM `waypoints` WHERE `entry` = 7784; +INSERT INTO `waypoints` (`entry`, `pointid`, `position_x`, `position_y`, `position_z`, `orientation`, `point_comment`) VALUES +(7784, 1, -8832.505, -4374.4556, 45.228176, NULL, 'Homing Robot OOX-17/TN'), +(7784, 2, -8810.634, -4373.8345, 32.52725, NULL, 'Homing Robot OOX-17/TN'), +(7784, 3, -8794.969, -4366.311, 25.909113, NULL, 'Homing Robot OOX-17/TN'), +(7784, 4, -8752.488, -4366.4326, 24.156054, NULL, 'Homing Robot OOX-17/TN'), +(7784, 5, -8724.97, -4352.2266, 20.758305, NULL, 'Homing Robot OOX-17/TN'), +(7784, 6, -8708.822, -4353.277, 18.39893, NULL, 'Homing Robot OOX-17/TN'), +(7784, 7, -8684.997, -4379.1943, 13.580014, NULL, 'Homing Robot OOX-17/TN'), +(7784, 8, -8656.829, -4388.013, 12.268159, NULL, 'Homing Robot OOX-17/TN'), +(7784, 9, -8612.755, -4397.2524, 9.681026, NULL, 'Homing Robot OOX-17/TN'), +(7784, 10, -8578.566, -4408.652, 11.647685, NULL, 'Homing Robot OOX-17/TN'), +(7784, 11, -8539.096, -4421.452, 12.621063, NULL, 'Homing Robot OOX-17/TN'), +(7784, 12, -8514.029, -4425.8203, 13.824177, NULL, 'Homing Robot OOX-17/TN'), +(7784, 13, -8486.308, -4428.784, 11.725893, NULL, 'Homing Robot OOX-17/TN'), +(7784, 14, -8446.95, -4440.7183, 9.385215, NULL, 'Homing Robot OOX-17/TN'), +(7784, 15, -8417.598, -4445.191, 10.350303, NULL, 'Homing Robot OOX-17/TN'), +(7784, 16, -8388.8955, -4448.0015, 10.9764805, NULL, 'Homing Robot OOX-17/TN'), +(7784, 17, -8352.005, -4447.594, 10.134734, NULL, 'Homing Robot OOX-17/TN'), +(7784, 18, -8352.005, -4447.594, 10.134734, 0.0104949, 'Homing Robot OOX-17/TN'), +-- Fly waypoints to give lift off time to play +(7784, 19, -8327.56, -4442.5103, 18.585197, NULL, 'Homing Robot OOX-17/TN'), +(7784, 20, -8262.676, -4426.0054, 34.8352, NULL, 'Homing Robot OOX-17/TN'), +(7784, 21, -8161.7275, -4410.5435, 58.08519, NULL, 'Homing Robot OOX-17/TN'); + +-- Update SmartAI waypoint references to match sniffed data +-- ID 3: Ambush/pause trigger on WP18 (pause point with orientation) +-- ID 5: Despawn on WP21 (final fly waypoint) +UPDATE `smart_scripts` SET `event_param1` = 18 WHERE `entryorguid` = 7784 AND `source_type` = 0 AND `id` = 3; +UPDATE `smart_scripts` SET `event_param1` = 21 WHERE `entryorguid` = 7784 AND `source_type` = 0 AND `id` = 5; From 98cf3cb0072cf3bcde0bb1f7b688d083397924f3 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Sun, 22 Feb 2026 18:31:56 +0000 Subject: [PATCH 031/150] chore(DB): import pending files Referenced commit(s): 2990f13840ca935359c1812ec7bfe44b6aac223d --- .../rev_1771548049716998200.sql => db_world/2026_02_22_05.sql} | 1 + 1 file changed, 1 insertion(+) rename data/sql/updates/{pending_db_world/rev_1771548049716998200.sql => db_world/2026_02_22_05.sql} (98%) diff --git a/data/sql/updates/pending_db_world/rev_1771548049716998200.sql b/data/sql/updates/db_world/2026_02_22_05.sql similarity index 98% rename from data/sql/updates/pending_db_world/rev_1771548049716998200.sql rename to data/sql/updates/db_world/2026_02_22_05.sql index 987817229..985aa3460 100644 --- a/data/sql/updates/pending_db_world/rev_1771548049716998200.sql +++ b/data/sql/updates/db_world/2026_02_22_05.sql @@ -1,3 +1,4 @@ +-- DB update 2026_02_22_04 -> 2026_02_22_05 UPDATE `creature_template` SET `AIName` = 'SmartAI' WHERE `entry` = 7784; DELETE FROM `smart_scripts` WHERE (`entryorguid` = 7784) AND (`source_type` = 0) AND (`id` IN (7)); From 96df2b3678419eaef82d16147aab63f4d4d0c6e0 Mon Sep 17 00:00:00 2001 From: blinkysc <37940565+blinkysc@users.noreply.github.com> Date: Sun, 22 Feb 2026 12:32:41 -0600 Subject: [PATCH 032/150] fix(Core/Spells): Fix Lock and Load procs (#24795) Co-authored-by: blinkysc --- .../pending_db_world/rev_1740153600000000000.sql | 3 +++ src/server/game/Spells/Spell.cpp | 6 ++++++ src/server/game/Spells/Spell.h | 3 +++ src/server/scripts/Spells/spell_hunter.cpp | 11 ++++++++++- 4 files changed, 22 insertions(+), 1 deletion(-) create mode 100644 data/sql/updates/pending_db_world/rev_1740153600000000000.sql diff --git a/data/sql/updates/pending_db_world/rev_1740153600000000000.sql b/data/sql/updates/pending_db_world/rev_1740153600000000000.sql new file mode 100644 index 000000000..54c12d40a --- /dev/null +++ b/data/sql/updates/pending_db_world/rev_1740153600000000000.sql @@ -0,0 +1,3 @@ +-- Lock and Load: allow periodic tick procs (Black Arrow, Explosive Trap) +-- SpellPhaseMask 6 = PROC_SPELL_PHASE_HIT | PROC_SPELL_PHASE_FINISH +UPDATE `spell_proc` SET `SpellPhaseMask` = 6 WHERE `SpellId` = -56342; diff --git a/src/server/game/Spells/Spell.cpp b/src/server/game/Spells/Spell.cpp index fb9b33958..9a1c2dc5e 100644 --- a/src/server/game/Spells/Spell.cpp +++ b/src/server/game/Spells/Spell.cpp @@ -719,6 +719,7 @@ Spell::~Spell() void Spell::InitExplicitTargets(SpellCastTargets const& targets) { m_targets = targets; + m_originalTargetGUID = targets.GetObjectTargetGUID(); // this function tries to correct spell explicit targets for spell // client doesn't send explicit targets correctly sometimes - we need to fix such spells serverside // this also makes sure that we correctly send explicit targets to client (removes redundant data) @@ -7855,6 +7856,11 @@ void Spell::DelayedChannel() SendChannelUpdate(m_timer); } +Unit* Spell::GetOriginalTarget() const +{ + return ObjectAccessor::GetUnit(*m_caster, m_originalTargetGUID); +} + bool Spell::UpdatePointers() { if (m_originalCasterGUID == m_caster->GetGUID()) diff --git a/src/server/game/Spells/Spell.h b/src/server/game/Spells/Spell.h index cb3f89540..a23d3b43c 100644 --- a/src/server/game/Spells/Spell.h +++ b/src/server/game/Spells/Spell.h @@ -585,6 +585,7 @@ public: Unit* GetCaster() const { return m_caster; } Unit* GetOriginalCaster() const { return m_originalCaster; } + Unit* GetOriginalTarget() const; SpellInfo const* GetSpellInfo() const { return m_spellInfo; } int32 GetPowerCost() const { return m_powerCost; } @@ -621,6 +622,8 @@ public: // e.g. damage around area spell trigered by victim aura and damage enemies of aura caster Unit* m_originalCaster; // cached pointer for m_originalCaster, updated at Spell::UpdatePointers() + ObjectGuid m_originalTargetGUID; // unit target saved before InitExplicitTargets strips it + Spell** m_selfContainer; // pointer to our spell container (if applicable) std::string GetDebugInfo() const; diff --git a/src/server/scripts/Spells/spell_hunter.cpp b/src/server/scripts/Spells/spell_hunter.cpp index 860415bcf..74ffa2b77 100644 --- a/src/server/scripts/Spells/spell_hunter.cpp +++ b/src/server/scripts/Spells/spell_hunter.cpp @@ -67,6 +67,7 @@ enum HunterSpells SPELL_HUNTER_GLYPH_OF_ARCANE_SHOT = 61389, SPELL_LOCK_AND_LOAD_TRIGGER = 56453, SPELL_LOCK_AND_LOAD_MARKER = 67544, + SPELL_FROST_TRAP_SLOW = 67035, SPELL_HUNTER_PET_LEGGINGS_OF_BEAST_MASTERY = 38297, // Leggings of Beast Mastery // Proc system spells @@ -1177,7 +1178,8 @@ class spell_hun_lock_and_load : public AuraScript return ValidateSpellInfo( { SPELL_LOCK_AND_LOAD_TRIGGER, - SPELL_LOCK_AND_LOAD_MARKER + SPELL_LOCK_AND_LOAD_MARKER, + SPELL_FROST_TRAP_SLOW }); } @@ -1197,6 +1199,13 @@ class spell_hun_lock_and_load : public AuraScript if (!spellInfo || !(spellInfo->GetSchoolMask() & (SPELL_SCHOOL_MASK_FROST | SPELL_SCHOOL_MASK_FIRE))) return false; + // TODO: Research whether Lock and Load should proc on targets + // immune to Frost Trap slow (bosses) in WotLK 3.3.5a. + // if (Spell const* procSpell = eventInfo.GetProcSpell()) + // if (Unit* target = procSpell->GetOriginalTarget()) + // if (target->IsImmunedToSpell(sSpellMgr->GetSpellInfo(SPELL_FROST_TRAP_SLOW))) + // return false; + return roll_chance_i(aurEff->GetAmount()); } From f432f4f9746e9905950a6cbc2919d7992bae5a06 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Sun, 22 Feb 2026 18:53:00 +0000 Subject: [PATCH 033/150] chore(DB): import pending files Referenced commit(s): fe0222cbdd108ced056ead5992b109702f3a5cdc --- .../rev_1740153600000000000.sql => db_world/2026_02_22_06.sql} | 1 + 1 file changed, 1 insertion(+) rename data/sql/updates/{pending_db_world/rev_1740153600000000000.sql => db_world/2026_02_22_06.sql} (82%) diff --git a/data/sql/updates/pending_db_world/rev_1740153600000000000.sql b/data/sql/updates/db_world/2026_02_22_06.sql similarity index 82% rename from data/sql/updates/pending_db_world/rev_1740153600000000000.sql rename to data/sql/updates/db_world/2026_02_22_06.sql index 54c12d40a..a648d9938 100644 --- a/data/sql/updates/pending_db_world/rev_1740153600000000000.sql +++ b/data/sql/updates/db_world/2026_02_22_06.sql @@ -1,3 +1,4 @@ +-- DB update 2026_02_22_05 -> 2026_02_22_06 -- Lock and Load: allow periodic tick procs (Black Arrow, Explosive Trap) -- SpellPhaseMask 6 = PROC_SPELL_PHASE_HIT | PROC_SPELL_PHASE_FINISH UPDATE `spell_proc` SET `SpellPhaseMask` = 6 WHERE `SpellId` = -56342; From 2bd4e4daeec225ce0895662628486e091369675f Mon Sep 17 00:00:00 2001 From: blinkysc <37940565+blinkysc@users.noreply.github.com> Date: Sun, 22 Feb 2026 13:10:51 -0600 Subject: [PATCH 034/150] fix(Core/Spells): Do not set proc SpellFamilyName without SpellFamilyMask (#24807) Co-authored-by: ariel- --- src/server/game/Spells/SpellMgr.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/server/game/Spells/SpellMgr.cpp b/src/server/game/Spells/SpellMgr.cpp index 4374d9d77..5751e7fec 100644 --- a/src/server/game/Spells/SpellMgr.cpp +++ b/src/server/game/Spells/SpellMgr.cpp @@ -2040,7 +2040,6 @@ void SpellMgr::LoadSpellProcs() // Generate default proc entry from DBC data SpellProcEntry procEntry; procEntry.SchoolMask = 0; - procEntry.SpellFamilyName = spellInfo->SpellFamilyName; procEntry.SpellFamilyMask[0] = 0; procEntry.SpellFamilyMask[1] = 0; procEntry.SpellFamilyMask[2] = 0; @@ -2048,6 +2047,11 @@ void SpellMgr::LoadSpellProcs() if (spellInfo->Effects[i].IsEffect() && isTriggerAura[spellInfo->Effects[i].ApplyAuraName]) procEntry.SpellFamilyMask |= spellInfo->Effects[i].SpellClassMask; + if (procEntry.SpellFamilyMask) + procEntry.SpellFamilyName = spellInfo->SpellFamilyName; + else + procEntry.SpellFamilyName = 0; + procEntry.ProcFlags = spellInfo->ProcFlags; procEntry.SpellTypeMask = procSpellTypeMask; procEntry.SpellPhaseMask = PROC_SPELL_PHASE_HIT; From 9f1071856626e49c63eb513e177eae2c528895c1 Mon Sep 17 00:00:00 2001 From: blinkysc <37940565+blinkysc@users.noreply.github.com> Date: Sun, 22 Feb 2026 13:11:06 -0600 Subject: [PATCH 035/150] fix(Core/Spells): Fix Swift Hand of Justice using wrong proc spell (#24808) Co-authored-by: blinkysc --- src/server/scripts/Spells/spell_item.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/server/scripts/Spells/spell_item.cpp b/src/server/scripts/Spells/spell_item.cpp index b0a801b6e..0fd4e999a 100644 --- a/src/server/scripts/Spells/spell_item.cpp +++ b/src/server/scripts/Spells/spell_item.cpp @@ -246,7 +246,7 @@ enum SunwellExaltedNeck enum SwiftHandOfJustice { - SPELL_SWIFT_HAND_OF_JUSTICE_HEAL = 59914 + SPELL_SWIFT_HAND_OF_JUSTICE_HEAL = 59913 }; enum TinyAbominationInAJar From 5a53ca6560d2399614fd6851ab1c329d16266086 Mon Sep 17 00:00:00 2001 From: blinkysc <37940565+blinkysc@users.noreply.github.com> Date: Sun, 22 Feb 2026 18:28:31 -0600 Subject: [PATCH 036/150] fix(Core/Spells): Fix Prayer of Mending not bouncing to full-HP members (#24815) Co-authored-by: blinkysc --- src/server/game/Grids/Notifiers/GridNotifiers.h | 2 +- src/server/game/Spells/Auras/SpellAuraEffects.cpp | 11 ++++++++--- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/src/server/game/Grids/Notifiers/GridNotifiers.h b/src/server/game/Grids/Notifiers/GridNotifiers.h index afb6b71bb..400fc6fdb 100644 --- a/src/server/game/Grids/Notifiers/GridNotifiers.h +++ b/src/server/game/Grids/Notifiers/GridNotifiers.h @@ -1539,7 +1539,7 @@ namespace Acore return false; } - if (u->IsAlive() && !i_obj->IsHostileTo(u) && i_obj->IsWithinDistInMap(u, i_range) && u->GetMaxHealth() - u->GetHealth() > i_hp) + if (u->IsAlive() && !i_obj->IsHostileTo(u) && i_obj->IsWithinDistInMap(u, i_range) && u->GetMaxHealth() - u->GetHealth() >= i_hp) { i_hp = u->GetMaxHealth() - u->GetHealth(); return true; diff --git a/src/server/game/Spells/Auras/SpellAuraEffects.cpp b/src/server/game/Spells/Auras/SpellAuraEffects.cpp index 775aab3d5..77250413f 100644 --- a/src/server/game/Spells/Auras/SpellAuraEffects.cpp +++ b/src/server/game/Spells/Auras/SpellAuraEffects.cpp @@ -7365,6 +7365,12 @@ void AuraEffect::HandleRaidProcFromChargeAuraProc(AuraApplication* aurApp, ProcE void AuraEffect::HandleRaidProcFromChargeWithValueAuraProc(AuraApplication* aurApp, ProcEventInfo& /*eventInfo*/) { + enum + { + SPELL_PRAYER_OF_MENDING_HEAL = 33110, + SPELL_PRAYER_OF_MENDING_VISUAL = 41637 + }; + Unit* target = aurApp->GetTarget(); // Currently only Prayer of Mending @@ -7373,7 +7379,6 @@ void AuraEffect::HandleRaidProcFromChargeWithValueAuraProc(AuraApplication* aurA LOG_DEBUG("spells.aura", "AuraEffect::HandleRaidProcFromChargeWithValueAuraProc: received not handled spell: {}", GetId()); return; } - uint32 triggerSpellId = 33110; int32 value = GetAmount(); @@ -7397,6 +7402,7 @@ void AuraEffect::HandleRaidProcFromChargeWithValueAuraProc(AuraApplication* aurA if (triggerTarget) { + target->CastSpell(triggerTarget, SPELL_PRAYER_OF_MENDING_VISUAL, true); target->CastCustomSpell(triggerTarget, GetId(), &value, nullptr, nullptr, true, nullptr, this, GetCasterGUID()); if (Aura* aura = triggerTarget->GetAura(GetId(), GetCasterGUID())) aura->SetCharges(jumps); @@ -7404,8 +7410,7 @@ void AuraEffect::HandleRaidProcFromChargeWithValueAuraProc(AuraApplication* aurA } } - LOG_DEBUG("spells.aura", "AuraEffect::HandleRaidProcFromChargeWithValueAuraProc: Triggering spell {} from aura {} proc", triggerSpellId, GetId()); - target->CastCustomSpell(target, triggerSpellId, &value, nullptr, nullptr, true, nullptr, this, GetCasterGUID()); + target->CastCustomSpell(target, SPELL_PRAYER_OF_MENDING_HEAL, &value, nullptr, nullptr, true, nullptr, this, GetCasterGUID()); } int32 AuraEffect::GetTotalTicks() const From af951de737f1747c37ff63db2f0ffe44a66203c5 Mon Sep 17 00:00:00 2001 From: sudlud Date: Mon, 23 Feb 2026 01:40:38 +0100 Subject: [PATCH 037/150] fix(DB/Gameobject): Sniffed Values for 'Offering Bowl' spawns (#24813) --- .../rev_1771793990610730500.sql | 37 +++++++++++++++++++ 1 file changed, 37 insertions(+) create mode 100644 data/sql/updates/pending_db_world/rev_1771793990610730500.sql diff --git a/data/sql/updates/pending_db_world/rev_1771793990610730500.sql b/data/sql/updates/pending_db_world/rev_1771793990610730500.sql new file mode 100644 index 000000000..4003c3a58 --- /dev/null +++ b/data/sql/updates/pending_db_world/rev_1771793990610730500.sql @@ -0,0 +1,37 @@ +-- Update gameobject 'Offering Bowl' with sniffed values +-- updated spawns +DELETE FROM `gameobject` WHERE (`id` IN (195068)) AND (`guid` IN (240205, 240206, 240207, 240208, 240209, 240210, 240211, 240212, 240213, 240214, 240215, 240216, 240217, 240218, 240219)); +INSERT INTO `gameobject` (`guid`, `id`, `map`, `zoneId`, `areaId`, `spawnMask`, `phaseMask`, `position_x`, `position_y`, `position_z`, `orientation`, `rotation0`, `rotation1`, `rotation2`, `rotation3`, `spawntimesecs`, `animprogress`, `state`, `ScriptName`, `VerifiedBuild`, `Comment`) VALUES +(240205, 195068, 0, 0, 0, 1, 1, 1780.13720703125, 269.758697509765625, 59.87249755859375, 0, 0, 0, 0, 1, 120, 255, 1, "", 51943, NULL), +(240206, 195068, 0, 0, 0, 1, 1, 1777.3125, 220.5381927490234375, 59.57676315307617187, 0, 0, 0, 0, 1, 120, 255, 1, "", 51943, NULL), +(240207, 195068, 1, 0, 0, 1, 1, 10053.5673828125, 2109.588623046875, 1329.647705078125, 0, 0, 0, 0, 1, 120, 255, 1, "", 51943, NULL), +(240208, 195068, 1, 0, 0, 1, 1, 10065.0107421875, 2118.71875, 1329.6578369140625, 0, 0, 0, 0, 1, 120, 255, 1, "", 51943, NULL), +(240209, 195068, 1, 0, 0, 1, 1, 10053.4443359375, 2128.55029296875, 1329.6578369140625, 0, 0, 0, 0, 1, 120, 255, 1, "", 51943, NULL), +(240210, 195068, 0, 0, 0, 1, 1, -5160.017578125, -869.029541015625, 507.289947509765625, 0, 0, 0, 0, 1, 120, 255, 1, "", 51943, NULL), +(240211, 195068, 0, 0, 0, 1, 1, -5159.92041015625, -870.56597900390625, 507.307281494140625, 0, 0, 0, 0, 1, 120, 255, 1, "", 51943, NULL), +(240212, 195068, 0, 0, 0, 1, 1, -9328.3662109375, 170.1875, 61.62678909301757812, 0, 0, 0, 0, 1, 120, 255, 1, "", 51943, NULL), +(240213, 195068, 0, 0, 0, 1, 1, -9327.1318359375, 181.86285400390625, 61.65506362915039062, 0, 0, 0, 0, 1, 120, 255, 1, "", 51943, NULL), +(240214, 195068, 1, 0, 0, 1, 1, 1180.125, -4457.48291015625, 21.48893928527832031, 0, 0, 0, 0, 1, 120, 255, 1, "", 51943, NULL), +(240215, 195068, 1, 0, 0, 1, 1, 1186.0677490234375, -4471.15283203125, 21.37073898315429687, 0, 0, 0, 0, 1, 120, 255, 1, "", 51943, NULL), +(240216, 195068, 1, 0, 0, 1, 1, 1172.282958984375, -4463.251953125, 21.28664779663085937, 0, 0, 0, 0, 1, 120, 255, 1, "", 51943, NULL), +(240217, 195068, 1, 0, 0, 1, 1, -983.0086669921875, -70.095489501953125, 20.78351402282714843, 0, 0, 0, 0, 1, 120, 255, 1, "", 46368, NULL), +(240218, 195068, 1, 0, 0, 1, 1, -984.638916015625, -76.1319427490234375, 20.85489082336425781, 0, 0, 0, 0, 1, 120, 255, 1, "", 46368, NULL), +(240219, 195068, 1, 0, 0, 1, 1, -984.920166015625, -75.171875, 20.93883132934570312, 0, 0, 0, 0, 1, 120, 255, 1, "", 46368, NULL); + +-- new spawns +DELETE FROM `gameobject` WHERE (`id` IN (195068)) AND (`guid` IN (1176, 1177, 1178, 1179, 1180, 1181, 1182, 1183, 1184, 1185)); +INSERT INTO `gameobject` (`guid`, `id`, `map`, `zoneId`, `areaId`, `spawnMask`, `phaseMask`, `position_x`, `position_y`, `position_z`, `orientation`, `rotation0`, `rotation1`, `rotation2`, `rotation3`, `spawntimesecs`, `animprogress`, `state`, `ScriptName`, `VerifiedBuild`, `Comment`) VALUES +(1176, 195068, 530, 0, 0, 1, 1, -1782.2535400390625, 4935.55029296875, -22.6603317260742187, 0, 0, 0, 0, 1, 120, 255, 1, "", 51943, NULL), +(1177, 195068, 530, 0, 0, 1, 1, -1835.9149169921875, 4922.8203125, -21.208261489868164, 0, 0, 0, 0, 1, 120, 255, 1, "", 51943, NULL), +(1178, 195068, 530, 0, 0, 1, 1, -4310.3369140625, -12439.53515625, 17.13308906555175781, 0, 0, 0, 0, 1, 120, 255, 1, "", 51943, NULL), +(1179, 195068, 530, 0, 0, 1, 1, -4318.94775390625, -12448.236328125, 17.12119102478027343, 0, 0, 0, 0, 1, 120, 255, 1, "", 51943, NULL), +(1180, 195068, 530, 0, 0, 1, 1, -4319.37353515625, -12455.69140625, 17.32845878601074218, 0, 0, 0, 0, 1, 120, 255, 1, "", 51943, NULL), +(1181, 195068, 530, 0, 0, 1, 1, -4322.97216796875, -12439.4619140625, 17.49305534362792968, 0, 0, 0, 0, 1, 120, 255, 1, "", 51943, NULL), +(1182, 195068, 530, 0, 0, 1, 1, 9418.6474609375, -6849.44970703125, 15.08854198455810546, 0, 0, 0, 0, 1, 120, 255, 1, "", 51943, NULL), +(1183, 195068, 530, 0, 0, 1, 1, 9418.884765625, -6854.578125, 14.94306755065917968, 0, 0, 0, 0, 1, 120, 255, 1, "", 51943, NULL), +(1184, 195068, 571, 0, 0, 1, 1, 5851.962890625, 771.29864501953125, 641.49884033203125, 0, 0, 0, 0, 1, 120, 255, 1, "", 46248, NULL), +(1185, 195068, 571, 0, 0, 1, 1, 5856.6162109375, 765.54339599609375, 641.33111572265625, 0, 0, 0, 0, 1, 120, 255, 1, "", 46248, NULL); + +-- enable all spawns for eventEntry 51 +DELETE FROM `game_event_gameobject` WHERE (`eventEntry` = 51) AND (`guid` IN (SELECT `guid` FROM `gameobject` WHERE `id` IN (195068))); +INSERT INTO `game_event_gameobject` (SELECT 51, `guid` FROM `gameobject` WHERE `id` IN (195068)); From adc14d93b27861a3d8fc1bf0ce5ed36123ca072f Mon Sep 17 00:00:00 2001 From: Nicolas Lebacq Date: Mon, 23 Feb 2026 01:41:32 +0100 Subject: [PATCH 038/150] fix(Scripts/ZulGurub): resolved an issue with Venoxis Holy Wrath spell targeting (#24746) --- src/server/scripts/EasternKingdoms/ZulGurub/boss_venoxis.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/server/scripts/EasternKingdoms/ZulGurub/boss_venoxis.cpp b/src/server/scripts/EasternKingdoms/ZulGurub/boss_venoxis.cpp index e5057638a..e706c472c 100644 --- a/src/server/scripts/EasternKingdoms/ZulGurub/boss_venoxis.cpp +++ b/src/server/scripts/EasternKingdoms/ZulGurub/boss_venoxis.cpp @@ -123,7 +123,7 @@ public: context.Repeat(25s, 30s); }).Schedule(15s, 25s, PHASE_ONE, [this](TaskContext context) { - DoCastRandomTarget(SPELL_HOLY_WRATH); + DoCastMaxThreat(SPELL_HOLY_WRATH, 0, 100.0f, true); context.Repeat(12s, 22s); }); From 1194c4fe95631184b6e53da457742dcdf17e3403 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Mon, 23 Feb 2026 00:41:45 +0000 Subject: [PATCH 039/150] chore(DB): import pending files Referenced commit(s): af951de737f1747c37ff63db2f0ffe44a66203c5 --- .../rev_1771793990610730500.sql => db_world/2026_02_23_00.sql} | 1 + 1 file changed, 1 insertion(+) rename data/sql/updates/{pending_db_world/rev_1771793990610730500.sql => db_world/2026_02_23_00.sql} (99%) diff --git a/data/sql/updates/pending_db_world/rev_1771793990610730500.sql b/data/sql/updates/db_world/2026_02_23_00.sql similarity index 99% rename from data/sql/updates/pending_db_world/rev_1771793990610730500.sql rename to data/sql/updates/db_world/2026_02_23_00.sql index 4003c3a58..e237501d3 100644 --- a/data/sql/updates/pending_db_world/rev_1771793990610730500.sql +++ b/data/sql/updates/db_world/2026_02_23_00.sql @@ -1,3 +1,4 @@ +-- DB update 2026_02_22_06 -> 2026_02_23_00 -- Update gameobject 'Offering Bowl' with sniffed values -- updated spawns DELETE FROM `gameobject` WHERE (`id` IN (195068)) AND (`guid` IN (240205, 240206, 240207, 240208, 240209, 240210, 240211, 240212, 240213, 240214, 240215, 240216, 240217, 240218, 240219)); From 832e54081307bb34d852149dda0c7955260f29ba Mon Sep 17 00:00:00 2001 From: Andrew <47818697+Nyeriah@users.noreply.github.com> Date: Sun, 22 Feb 2026 21:42:04 -0300 Subject: [PATCH 040/150] fix(DB/Creature): Malygos (10/25) despawn on evade (#24814) Co-authored-by: Claude Opus 4.6 --- data/sql/updates/pending_db_world/rev_1771800217482566400.sql | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 data/sql/updates/pending_db_world/rev_1771800217482566400.sql diff --git a/data/sql/updates/pending_db_world/rev_1771800217482566400.sql b/data/sql/updates/pending_db_world/rev_1771800217482566400.sql new file mode 100644 index 000000000..ecebdea92 --- /dev/null +++ b/data/sql/updates/pending_db_world/rev_1771800217482566400.sql @@ -0,0 +1,2 @@ +-- Malygos (10 and 25) - Add despawn on evade (CREATURE_FLAG_EXTRA_HARD_RESET) +UPDATE `creature_template` SET `flags_extra` = `flags_extra`|0x80000000 WHERE `entry` IN (28859, 31734); From c0ddf3d86046feb56d6a51fb109a0ebd2981ad24 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Mon, 23 Feb 2026 00:42:38 +0000 Subject: [PATCH 041/150] chore(DB): import pending files Referenced commit(s): adc14d93b27861a3d8fc1bf0ce5ed36123ca072f --- .../rev_1771800217482566400.sql => db_world/2026_02_23_01.sql} | 1 + 1 file changed, 1 insertion(+) rename data/sql/updates/{pending_db_world/rev_1771800217482566400.sql => db_world/2026_02_23_01.sql} (80%) diff --git a/data/sql/updates/pending_db_world/rev_1771800217482566400.sql b/data/sql/updates/db_world/2026_02_23_01.sql similarity index 80% rename from data/sql/updates/pending_db_world/rev_1771800217482566400.sql rename to data/sql/updates/db_world/2026_02_23_01.sql index ecebdea92..685f7cc8c 100644 --- a/data/sql/updates/pending_db_world/rev_1771800217482566400.sql +++ b/data/sql/updates/db_world/2026_02_23_01.sql @@ -1,2 +1,3 @@ +-- DB update 2026_02_23_00 -> 2026_02_23_01 -- Malygos (10 and 25) - Add despawn on evade (CREATURE_FLAG_EXTRA_HARD_RESET) UPDATE `creature_template` SET `flags_extra` = `flags_extra`|0x80000000 WHERE `entry` IN (28859, 31734); From 7c0701b41b2fc41de19ac761760fe99c3071dfed Mon Sep 17 00:00:00 2001 From: blinkysc <37940565+blinkysc@users.noreply.github.com> Date: Sun, 22 Feb 2026 18:44:05 -0600 Subject: [PATCH 042/150] fix(Core/Spells): Lock and Load proc on immune (#24818) --- src/server/scripts/Spells/spell_hunter.cpp | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/src/server/scripts/Spells/spell_hunter.cpp b/src/server/scripts/Spells/spell_hunter.cpp index 74ffa2b77..9512644dc 100644 --- a/src/server/scripts/Spells/spell_hunter.cpp +++ b/src/server/scripts/Spells/spell_hunter.cpp @@ -1199,12 +1199,11 @@ class spell_hun_lock_and_load : public AuraScript if (!spellInfo || !(spellInfo->GetSchoolMask() & (SPELL_SCHOOL_MASK_FROST | SPELL_SCHOOL_MASK_FIRE))) return false; - // TODO: Research whether Lock and Load should proc on targets - // immune to Frost Trap slow (bosses) in WotLK 3.3.5a. - // if (Spell const* procSpell = eventInfo.GetProcSpell()) - // if (Unit* target = procSpell->GetOriginalTarget()) - // if (target->IsImmunedToSpell(sSpellMgr->GetSpellInfo(SPELL_FROST_TRAP_SLOW))) - // return false; + // immune to Frost Trap slow (bosses) in WotLK patch 3.2.0 + if (Spell const* procSpell = eventInfo.GetProcSpell()) + if (Unit* target = procSpell->GetOriginalTarget()) + if (target->IsImmunedToSpell(sSpellMgr->GetSpellInfo(SPELL_FROST_TRAP_SLOW))) + return false; return roll_chance_i(aurEff->GetAmount()); } From 6097aacc81ff40c047f09b9cfa2e0dca09995c78 Mon Sep 17 00:00:00 2001 From: blinkysc <37940565+blinkysc@users.noreply.github.com> Date: Sun, 22 Feb 2026 18:49:20 -0600 Subject: [PATCH 043/150] fix(DB/Spells): Fix Darkmoon Card: Illusion restoring double mana (#24816) Co-authored-by: blinkysc --- data/sql/updates/pending_db_world/rev_1771802367872480571.sql | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 data/sql/updates/pending_db_world/rev_1771802367872480571.sql diff --git a/data/sql/updates/pending_db_world/rev_1771802367872480571.sql b/data/sql/updates/pending_db_world/rev_1771802367872480571.sql new file mode 100644 index 000000000..d8322ceb2 --- /dev/null +++ b/data/sql/updates/pending_db_world/rev_1771802367872480571.sql @@ -0,0 +1,2 @@ +-- Darkmoon Card: Illusion - remove duplicate mana restore (handled by C++ script) +DELETE FROM `spell_linked_spell` WHERE `spell_trigger` = -57350 AND `spell_effect` = 60242; From 3d23a63c7ee741027db0bfa181bc42d400ad02a4 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Mon, 23 Feb 2026 00:50:42 +0000 Subject: [PATCH 044/150] chore(DB): import pending files Referenced commit(s): 6097aacc81ff40c047f09b9cfa2e0dca09995c78 --- .../rev_1771802367872480571.sql => db_world/2026_02_23_02.sql} | 1 + 1 file changed, 1 insertion(+) rename data/sql/updates/{pending_db_world/rev_1771802367872480571.sql => db_world/2026_02_23_02.sql} (79%) diff --git a/data/sql/updates/pending_db_world/rev_1771802367872480571.sql b/data/sql/updates/db_world/2026_02_23_02.sql similarity index 79% rename from data/sql/updates/pending_db_world/rev_1771802367872480571.sql rename to data/sql/updates/db_world/2026_02_23_02.sql index d8322ceb2..69dc72cdd 100644 --- a/data/sql/updates/pending_db_world/rev_1771802367872480571.sql +++ b/data/sql/updates/db_world/2026_02_23_02.sql @@ -1,2 +1,3 @@ +-- DB update 2026_02_23_01 -> 2026_02_23_02 -- Darkmoon Card: Illusion - remove duplicate mana restore (handled by C++ script) DELETE FROM `spell_linked_spell` WHERE `spell_trigger` = -57350 AND `spell_effect` = 60242; From beca6fef53caa4ccfa504a0bcc68f1e6eacf1913 Mon Sep 17 00:00:00 2001 From: blinkysc <37940565+blinkysc@users.noreply.github.com> Date: Sun, 22 Feb 2026 19:11:21 -0600 Subject: [PATCH 045/150] fix(Core/Spells): Fix Lock and Load proccing from Explosive Trap activation (#24821) Co-authored-by: blinkysc --- src/server/scripts/Spells/spell_hunter.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/server/scripts/Spells/spell_hunter.cpp b/src/server/scripts/Spells/spell_hunter.cpp index 9512644dc..fa9e2d79e 100644 --- a/src/server/scripts/Spells/spell_hunter.cpp +++ b/src/server/scripts/Spells/spell_hunter.cpp @@ -1195,8 +1195,10 @@ class spell_hun_lock_and_load : public AuraScript if (!(eventInfo.GetTypeMask() & PROC_FLAG_DONE_TRAP_ACTIVATION)) return false; + // Patch 3.3.3: Lock and Load no longer triggers from Explosive Trap activation, + // only from frost trap activation. Fire traps proc via CheckPeriodicProc instead. SpellInfo const* spellInfo = eventInfo.GetSpellInfo(); - if (!spellInfo || !(spellInfo->GetSchoolMask() & (SPELL_SCHOOL_MASK_FROST | SPELL_SCHOOL_MASK_FIRE))) + if (!spellInfo || !(spellInfo->GetSchoolMask() & SPELL_SCHOOL_MASK_FROST)) return false; // immune to Frost Trap slow (bosses) in WotLK patch 3.2.0 From bce0be9fdb7312aa8657d9c5cbacaa8b471d8110 Mon Sep 17 00:00:00 2001 From: blinkysc <37940565+blinkysc@users.noreply.github.com> Date: Sun, 22 Feb 2026 19:11:35 -0600 Subject: [PATCH 046/150] fix(Core/Spells): Prevent vehicles from receiving party/raid area auras (#24820) Co-authored-by: blinkysc --- src/server/game/Grids/Notifiers/GridNotifiers.h | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/server/game/Grids/Notifiers/GridNotifiers.h b/src/server/game/Grids/Notifiers/GridNotifiers.h index 400fc6fdb..34f0c09ad 100644 --- a/src/server/game/Grids/Notifiers/GridNotifiers.h +++ b/src/server/game/Grids/Notifiers/GridNotifiers.h @@ -1005,6 +1005,9 @@ namespace Acore AnyGroupedUnitInObjectRangeCheck(WorldObject const* obj, Unit const* funit, float range, bool raid) : _source(obj), _refUnit(funit), _range(range), _raid(raid) {} bool operator()(Unit* u) { + if (u->IsVehicle()) + return false; + if (_raid) { if (!_refUnit->IsInRaidWith(u)) From b035d1f914fddf01276b4b13ed68eaca38a6c4b0 Mon Sep 17 00:00:00 2001 From: Gultask <100873791+Gultask@users.noreply.github.com> Date: Sun, 22 Feb 2026 22:11:52 -0300 Subject: [PATCH 047/150] feat(Core/SmartScripts): Implement Target Type for Formations (#24811) --- .../game/AI/SmartScripts/SmartScript.cpp | 44 +++++++++++++++++++ .../game/AI/SmartScripts/SmartScriptMgr.cpp | 13 ++++++ .../game/AI/SmartScripts/SmartScriptMgr.h | 10 ++++- 3 files changed, 66 insertions(+), 1 deletion(-) diff --git a/src/server/game/AI/SmartScripts/SmartScript.cpp b/src/server/game/AI/SmartScripts/SmartScript.cpp index f80a36d7a..ec4bf27d6 100644 --- a/src/server/game/AI/SmartScripts/SmartScript.cpp +++ b/src/server/game/AI/SmartScripts/SmartScript.cpp @@ -19,6 +19,7 @@ #include "Cell.h" #include "CellImpl.h" #include "ChatTextBuilder.h" +#include "CreatureGroups.h" #include "CreatureTextMgr.h" #include "GameEventMgr.h" #include "GossipDef.h" @@ -4062,6 +4063,49 @@ void SmartScript::GetTargets(ObjectVector& targets, SmartScriptHolder const& e, break; } + case SMART_TARGET_FORMATION: + { + if (me) + { + if (CreatureGroup* group = me->GetFormation()) + { + uint32 formationType = e.target.formation.type; + uint32 entry = e.target.formation.entry; + bool excludeSelf = e.target.formation.excludeSelf; + + if (formationType == 1) // Leader only + { + if (Creature* leader = group->GetLeader()) + { + if ((!excludeSelf || leader != me) && (!entry || leader->GetEntry() == entry)) + targets.push_back(leader); + } + } + else // 0 = Members only, 2 = All + { + for (auto const& itr : group->GetMembers()) + { + Creature* member = itr.first; + + if (!member) + continue; + + if (excludeSelf && member == me) + continue; + + if (entry && member->GetEntry() != entry) + continue; + + if (formationType == 0 && member == group->GetLeader()) + continue; + + targets.push_back(member); + } + } + } + } + break; + } case SMART_TARGET_NONE: case SMART_TARGET_POSITION: default: diff --git a/src/server/game/AI/SmartScripts/SmartScriptMgr.cpp b/src/server/game/AI/SmartScripts/SmartScriptMgr.cpp index 52faaef4b..3f0cbdef0 100644 --- a/src/server/game/AI/SmartScripts/SmartScriptMgr.cpp +++ b/src/server/game/AI/SmartScripts/SmartScriptMgr.cpp @@ -531,6 +531,18 @@ bool SmartAIMgr::IsTargetValid(SmartScriptHolder const& e) } break; } + case SMART_TARGET_FORMATION: + { + if (e.target.formation.type > 2) + { + LOG_ERROR("sql.sql", "SmartAIMgr: Entry {} SourceType {} Event {} Action {} has invalid formation target type ({}, must be 0-2).", + e.entryOrGuid, e.GetScriptType(), e.GetEventType(), e.GetActionType(), e.target.formation.type); + return false; + } + if (e.target.formation.entry && !IsCreatureValid(e, e.target.formation.entry)) + return false; + return IsSAIBoolValid(e, e.target.formation.excludeSelf); + } case SMART_TARGET_HOSTILE_SECOND_AGGRO: case SMART_TARGET_HOSTILE_LAST_AGGRO: case SMART_TARGET_HOSTILE_RANDOM: @@ -955,6 +967,7 @@ bool SmartAIMgr::CheckUnusedTargetParams(SmartScriptHolder const& e) case SMART_TARGET_RANDOM_POINT: return sizeof(SmartTarget::randomPoint); case SMART_TARGET_SUMMONED_CREATURES: return sizeof(SmartTarget::summonedCreatures); case SMART_TARGET_INSTANCE_STORAGE: return sizeof(SmartTarget::instanceStorage); + case SMART_TARGET_FORMATION: return sizeof(SmartTarget::formation); default: LOG_WARN("sql.sql", "SmartAIMgr: entryorguid {} source_type {} id {} action_type {} is using a target {} with no unused params specified in SmartAIMgr::CheckUnusedTargetParams(), please report this.", e.entryOrGuid, e.GetScriptType(), e.event_id, e.GetActionType(), e.GetTargetType()); diff --git a/src/server/game/AI/SmartScripts/SmartScriptMgr.h b/src/server/game/AI/SmartScripts/SmartScriptMgr.h index 2601f5bd1..e87e01e62 100644 --- a/src/server/game/AI/SmartScripts/SmartScriptMgr.h +++ b/src/server/game/AI/SmartScripts/SmartScriptMgr.h @@ -1581,8 +1581,9 @@ enum SMARTAI_TARGETS SMART_TARGET_ROLE_SELECTION = 203, // Range Max, TargetMask (Tanks (1), Healer (2) Damage (4)), resize list SMART_TARGET_SUMMONED_CREATURES = 204, // Entry SMART_TARGET_INSTANCE_STORAGE = 205, // Instance data index, Type (creature (1), gameobject (2)) + SMART_TARGET_FORMATION = 206, // Type (0: members only, 1: leader only, 2: all), CreatureEntry (0: any), ExcludeSelf (0/1) - SMART_TARGET_AC_END = 206 // placeholder + SMART_TARGET_AC_END = 207 // placeholder }; struct SmartTarget @@ -1759,6 +1760,13 @@ struct SmartTarget uint32 type; } instanceStorage; + struct + { + uint32 type; // 0: members only, 1: leader only, 2: all + uint32 entry; // creature entry filter, 0 = any + SAIBool excludeSelf; + } formation; + struct { SAIBool includePets; From 27f891543806a881cc554e4d8e4509ad692ff5dc Mon Sep 17 00:00:00 2001 From: Walter Pagani Date: Sun, 22 Feb 2026 22:12:23 -0300 Subject: [PATCH 048/150] fix(DB/Text): Add some translations (esES and esMX) (#24805) --- .../rev_1771767222932614900.sql | 89 +++++++++++++++++++ 1 file changed, 89 insertions(+) create mode 100644 data/sql/updates/pending_db_world/rev_1771767222932614900.sql diff --git a/data/sql/updates/pending_db_world/rev_1771767222932614900.sql b/data/sql/updates/pending_db_world/rev_1771767222932614900.sql new file mode 100644 index 000000000..1a7de9af1 --- /dev/null +++ b/data/sql/updates/pending_db_world/rev_1771767222932614900.sql @@ -0,0 +1,89 @@ +UPDATE `acore_string` SET `locale_esES` = 'El comando ''{}'' no existe.', `locale_esMX` = 'El comando ''{}'' no existe.' WHERE `entry` = 6; +UPDATE `acore_string` SET `locale_esES` = 'El subcomando ''{}{}{}'' es ambiguo:', `locale_esMX` = 'El subcomando ''{}{}{}'' es ambiguo:' WHERE `entry` = 7; +UPDATE `acore_string` SET `locale_esES` = 'Posibles subcomandos:', `locale_esMX` = 'Posibles subcomandos:' WHERE `entry` = 8; +UPDATE `acore_string` SET `locale_esES` = '| Flags de la cuenta:', `locale_esMX` = '| Flags de la cuenta:' WHERE `entry` = 179; +UPDATE `acore_string` SET `locale_esES` = 'Este nombre es profano, elige otro.', `locale_esMX` = 'Este nombre es profano, elige otro.' WHERE `entry` = 187; +UPDATE `acore_string` SET `locale_esES` = '|- {}', `locale_esMX` = '|- {}' WHERE `entry` = 191; +UPDATE `acore_string` SET `locale_esES` = '|- {} ...', `locale_esMX` = '|- {} ...' WHERE `entry` = 192; +UPDATE `acore_string` SET `locale_esES` = 'El subcomando ''{}{}{}'' no existe.', `locale_esMX` = 'El subcomando ''{}{}{}'' no existe.' WHERE `entry` = 193; +UPDATE `acore_string` SET `locale_esES` = 'El comando ''{}'' es ambiguo:', `locale_esMX` = 'El comando ''{}'' es ambiguo:' WHERE `entry` = 194; +UPDATE `acore_string` SET `locale_esES` = '### USO: .{} ...', `locale_esMX` = '### USO: .{} ...' WHERE `entry` = 195; +UPDATE `acore_string` SET `locale_esES` = 'No hay información detallada de uso asociada a ''{}''. Esto nunca debería ocurrir con los comandos estándar de AzerothCore; si ocurre, repórtalo como un error.', `locale_esMX` = 'No hay información detallada de uso asociada a ''{}''. Esto nunca debería ocurrir con los comandos estándar de AzerothCore; si ocurre, repórtalo como un error.' WHERE `entry` = 196; +UPDATE `acore_string` SET `locale_esES` = 'Recuperar ID: {} | Item: {} ({}) | Cantidad: {}', `locale_esMX` = 'Recuperar ID: {} | Item: {} ({}) | Cantidad: {}' WHERE `entry` = 197; +UPDATE `acore_string` SET `locale_esES` = 'El jugador no tiene items recuperables', `locale_esMX` = 'El jugador no tiene items recuperables' WHERE `entry` = 198; +UPDATE `acore_string` SET `locale_esES` = 'El jugador no tiene item recuperable con id {}', `locale_esMX` = 'El jugador no tiene item recuperable con id {}' WHERE `entry` = 199; +UPDATE `acore_string` SET `locale_esES` = 'No se puede ir al spawn {} ya que solo existen {}', `locale_esMX` = 'No se puede ir al spawn {} ya que solo existen {}' WHERE `entry` = 288; +UPDATE `acore_string` SET `locale_esES` = 'Honorable', `locale_esMX` = 'Honorable' WHERE `entry` = 323; +UPDATE `acore_string` SET `locale_esES` = 'Venerado', `locale_esMX` = 'Venerado' WHERE `entry` = 324; +UPDATE `acore_string` SET `locale_esES` = 'Exaltado', `locale_esMX` = 'Exaltado' WHERE `entry` = 325; +UPDATE `acore_string` SET `locale_esES` = 'La facción {} ({}) no puede tener reputación.', `locale_esMX` = 'La facción {} ({}) no puede tener reputación.' WHERE `entry` = 326; +UPDATE `acore_string` SET `locale_esES` = ' [sin reputación]', `locale_esMX` = ' [sin reputación]' WHERE `entry` = 327; +UPDATE `acore_string` SET `locale_esES` = 'Personajes en la cuenta {} (Id: {})', `locale_esMX` = 'Personajes en la cuenta {} (Id: {})' WHERE `entry` = 328; +UPDATE `acore_string` SET `locale_esES` = ' {} (GUID {})', `locale_esMX` = ' {} (GUID {})' WHERE `entry` = 329; +UPDATE `acore_string` SET `locale_esES` = '¡No se encontraron jugadores!', `locale_esMX` = '¡No se encontraron jugadores!' WHERE `entry` = 330; +UPDATE `acore_string` SET `locale_esES` = 'El costo del item extendido {} no existe', `locale_esMX` = 'El costo del item extendido {} no existe' WHERE `entry` = 331; +UPDATE `acore_string` SET `locale_esES` = 'El modo GM está activado.', `locale_esMX` = 'El modo GM está activado.' WHERE `entry` = 332; +UPDATE `acore_string` SET `locale_esES` = 'El modo GM está desactivado.', `locale_esMX` = 'El modo GM está desactivado.' WHERE `entry` = 333; +UPDATE `acore_string` SET `locale_esES` = 'La insignia de chat de GM está activada.', `locale_esMX` = 'La insignia de chat de GM está activada.' WHERE `entry` = 334; +UPDATE `acore_string` SET `locale_esES` = 'La insignia de chat de GM está desactivada.', `locale_esMX` = 'La insignia de chat de GM está desactivada.' WHERE `entry` = 335; +UPDATE `acore_string` SET `locale_esES` = 'Reparas todos los items de {}.', `locale_esMX` = 'Reparas todos los items de {}.' WHERE `entry` = 336; +UPDATE `acore_string` SET `locale_esES` = 'Todos tus items reparados por {}.', `locale_esMX` = 'Todos tus items reparados por {}.' WHERE `entry` = 337; +UPDATE `acore_string` SET `locale_esES` = 'Has configurado el modo caminar sobre el agua {} para {}.', `locale_esMX` = 'Has configurado el modo caminar sobre el agua {} para {}.' WHERE `entry` = 338; +UPDATE `acore_string` SET `locale_esES` = 'Tu modo de caminar sobre el agua {} por {}.', `locale_esMX` = 'Tu modo de caminar sobre el agua {} por {}.' WHERE `entry` = 339; +UPDATE `acore_string` SET `locale_esES` = '{} ahora te está siguiendo.', `locale_esMX` = '{} ahora te está siguiendo.' WHERE `entry` = 340; +UPDATE `acore_string` SET `locale_esES` = '{} no te está siguiendo.', `locale_esMX` = '{} no te está siguiendo.' WHERE `entry` = 341; +UPDATE `acore_string` SET `locale_esES` = '{} ya no te está siguiendo.', `locale_esMX` = '{} ya no te está siguiendo.' WHERE `entry` = 342; +UPDATE `acore_string` SET `locale_esES` = 'La criatura (entry: {}) no puede ser domesticada.', `locale_esMX` = 'La criatura (entry: {}) no puede ser domesticada.' WHERE `entry` = 343; +UPDATE `acore_string` SET `locale_esES` = 'Ya tienes mascota.', `locale_esMX` = 'Ya tienes mascota.' WHERE `entry` = 344; +UPDATE `acore_string` SET `locale_esES` = 'Se solicitará una personalización forzada para el jugador {} en el próximo inicio de sesión.', `locale_esMX` = 'Se solicitará una personalización forzada para el jugador {} en el próximo inicio de sesión.' WHERE `entry` = 345; +UPDATE `acore_string` SET `locale_esES` = 'Se solicitará una personalización forzada para el jugador {} (GUID #{}) en el próximo inicio de sesión.', `locale_esMX` = 'Se solicitará una personalización forzada para el jugador {} (GUID #{}) en el próximo inicio de sesión.' WHERE `entry` = 346; +UPDATE `acore_string` SET `locale_esES` = '¡TaxiNode ID {} no encontrado!', `locale_esMX` = '¡TaxiNode ID {} no encontrado!' WHERE `entry` = 347; +UPDATE `acore_string` SET `locale_esES` = 'El objeto de juego (Entrada: {}) tiene datos no válidos y no se puede generar.', `locale_esMX` = 'El objeto de juego (Entrada: {}) tiene datos no válidos y no se puede generar.' WHERE `entry` = 348; +UPDATE `acore_string` SET `locale_esES` = '{} (idx:{}) - |cffffffff|Htítulo:{}|h[{} {}]|h|r {} {} ', `locale_esMX` = '{} (idx:{}) - |cffffffff|Htítulo:{}|h[{} {}]|h|r {} {} ' WHERE `entry` = 349; +UPDATE `acore_string` SET `locale_esES` = '{} (idx: {}) - [{} {}] {} {} ', `locale_esMX` = '{} (idx: {}) - [{} {}] {} {} ' WHERE `entry` = 350; +UPDATE `acore_string` SET `locale_esES` = '¡No se encontraron títulos!', `locale_esMX` = '¡No se encontraron títulos!' WHERE `entry` = 351; +UPDATE `acore_string` SET `locale_esES` = 'ID de título no válido: {}.', `locale_esMX` = 'ID de título no válido: {}.' WHERE `entry` = 352; +UPDATE `acore_string` SET `locale_esES` = 'Se agregó el título {} ({}) a la lista de títulos conocidos para el jugador {}.', `locale_esMX` = 'Se agregó el título {} ({}) a la lista de títulos conocidos para el jugador {}.' WHERE `entry` = 353; +UPDATE `acore_string` SET `locale_esES` = 'El título {} ({}) se eliminó de la lista de títulos conocidos para el jugador {}.', `locale_esMX` = 'El título {} ({}) se eliminó de la lista de títulos conocidos para el jugador {}.' WHERE `entry` = 354; +UPDATE `acore_string` SET `locale_esES` = 'Título {} ({}) establecido como título seleccionado actual para el jugador {}.', `locale_esMX` = 'Título {} ({}) establecido como título seleccionado actual para el jugador {}.' WHERE `entry` = 355; +UPDATE `acore_string` SET `locale_esES` = 'El título seleccionado actualmente para el jugador {} se restableció porque no se conoce ahora.', `locale_esMX` = 'El título seleccionado actualmente para el jugador {} se restableció porque no se conoce ahora.' WHERE `entry` = 356; +UPDATE `acore_string` SET `locale_esES` = 'Estado del comando de trucos:', `locale_esMX` = 'Estado del comando de trucos:' WHERE `entry` = 357; +UPDATE `acore_string` SET `locale_esES` = 'Modo Dios: {}.', `locale_esMX` = 'Modo Dios: {}.' WHERE `entry` = 358; +UPDATE `acore_string` SET `locale_esES` = 'Tiempo de lanzamiento: {}.', `locale_esMX` = 'Tiempo de lanzamiento: {}.' WHERE `entry` = 359; +UPDATE `acore_string` SET `locale_esES` = 'Enfriamiento: {}.', `locale_esMX` = 'Enfriamiento: {}.' WHERE `entry` = 360; +UPDATE `acore_string` SET `locale_esES` = 'Fuerza: {}.', `locale_esMX` = 'Fuerza: {}.' WHERE `entry` = 361; +UPDATE `acore_string` SET `locale_esES` = 'Caminar sobre el agua: {}.', `locale_esMX` = 'Caminar sobre el agua: {}.' WHERE `entry` = 362; +UPDATE `acore_string` SET `locale_esES` = 'El jugador {} no puede susurrarte más.', `locale_esMX` = 'El jugador {} no puede susurrarte más.' WHERE `entry` = 363; +UPDATE `acore_string` SET `locale_esES` = 'Taxinodes: {}.', `locale_esMX` = 'Taxinodes: {}.' WHERE `entry` = 364; +UPDATE `acore_string` SET `locale_esES` = '|cffffffff{}|r items equipados eliminados por {}.', `locale_esMX` = '|cffffffff{}|r items equipados eliminados por {}.' WHERE `entry` = 365; +UPDATE `acore_string` SET `locale_esES` = '| cffffffff {} | r items en bolsas equipadas eliminados para {}', `locale_esMX` = '| cffffffff {} | r items en bolsas equipadas eliminados para {}' WHERE `entry` = 366; +UPDATE `acore_string` SET `locale_esES` = '|cffffffff{}|r items en el banco eliminados por {}.', `locale_esMX` = '|cffffffff{}|r items en el banco eliminados por {}.' WHERE `entry` = 367; +UPDATE `acore_string` SET `locale_esES` = '|cffffffff{}|r llaves en el llavero eliminadas para {}', `locale_esMX` = '|cffffffff{}|r llaves en el llavero eliminadas para {}' WHERE `entry` = 368; +UPDATE `acore_string` SET `locale_esES` = '|cffffffff{}|r monedas eliminadas por {}.', `locale_esMX` = '|cffffffff{}|r monedas eliminadas por {}.' WHERE `entry` = 369; +UPDATE `acore_string` SET `locale_esES` = '|cffffffff{}|r artículos en recompra de proveedores eliminados por {}.', `locale_esMX` = '|cffffffff{}|r artículos en recompra de proveedores eliminados por {}.' WHERE `entry` = 370; +UPDATE `acore_string` SET `locale_esES` = '¡La Alianza capturó el Cementerio Sur!', `locale_esMX` = '¡La Alianza capturó el Cementerio Sur!' WHERE `entry` = 10068; +UPDATE `acore_string` SET `locale_esES` = '¡La Alianza capturó el Cementerio Oeste!', `locale_esMX` = '¡La Alianza capturó el Cementerio Oeste!' WHERE `entry` = 10069; +UPDATE `acore_string` SET `locale_esES` = '¡La Alianza capturó el Cementerio Este!', `locale_esMX` = '¡La Alianza capturó el Cementerio Este!' WHERE `entry` = 10070; +UPDATE `acore_string` SET `locale_esES` = '¡La Horda capturó el Cementerio Sur!', `locale_esMX` = '¡La Horda capturó el Cementerio Sur!' WHERE `entry` = 10071; +UPDATE `acore_string` SET `locale_esES` = '¡La Horda capturó el Cementerio Oeste!', `locale_esMX` = '¡La Horda capturó el Cementerio Oeste!' WHERE `entry` = 10072; +UPDATE `acore_string` SET `locale_esES` = '¡La Horda capturó el Cementerio Este!', `locale_esMX` = '¡La Horda capturó el Cementerio Este!' WHERE `entry` = 10073; +UPDATE `acore_string` SET `locale_esES` = 'Horda', `locale_esMX` = 'Horda' WHERE `entry` = 12056; +UPDATE `acore_string` SET `locale_esES` = 'Alianza', `locale_esMX` = 'Alianza' WHERE `entry` = 12057; +UPDATE `acore_string` SET `locale_esES` = '¡La batalla por Conquista del Invierno está a punto de comenzar!', `locale_esMX` = '¡La batalla por Conquista del Invierno está a punto de comenzar!' WHERE `entry` = 12058; +UPDATE `acore_string` SET `locale_esES` = 'Has alcanzado el rango 1: Cabo', `locale_esMX` = 'Has alcanzado el rango 1: Cabo' WHERE `entry` = 12059; +UPDATE `acore_string` SET `locale_esES` = 'Has alcanzado el rango 2: primer teniente', `locale_esMX` = 'Has alcanzado el rango 2: primer teniente' WHERE `entry` = 12060; +UPDATE `acore_string` SET `locale_esES` = 'La torre del homenaje del sureste', `locale_esMX` = 'La torre del homenaje del sureste' WHERE `entry` = 12061; +UPDATE `acore_string` SET `locale_esES` = 'La torre del homenaje del noreste', `locale_esMX` = 'La torre del homenaje del noreste' WHERE `entry` = 12062; +UPDATE `acore_string` SET `locale_esES` = 'La torre del homenaje suroeste', `locale_esMX` = 'La torre del homenaje suroeste' WHERE `entry` = 12063; +UPDATE `acore_string` SET `locale_esES` = 'La torre del homenaje del noroeste', `locale_esMX` = 'La torre del homenaje del noroeste' WHERE `entry` = 12064; +UPDATE `acore_string` SET `locale_esES` = '{} ha sido dañada!', `locale_esMX` = '{} ha sido dañada!' WHERE `entry` = 12065; +UPDATE `acore_string` SET `locale_esES` = '{} ha sido destruida!', `locale_esMX` = '{} ha sido destruida!' WHERE `entry` = 12066; +UPDATE `acore_string` SET `locale_esES` = '¡Comienza la batalla por Conquista del Invierno!', `locale_esMX` = '¡Comienza la batalla por Conquista del Invierno!' WHERE `entry` = 12067; +UPDATE `acore_string` SET `locale_esES` = '¡{} ha defendido con éxito la fortaleza Conquista del Invierno!', `locale_esMX` = '¡{} ha defendido con éxito la fortaleza Conquista del Invierno!' WHERE `entry` = 12068; +UPDATE `acore_string` SET `locale_esES` = '{} ha sido capturado por {}', `locale_esMX` = '{} ha sido capturado por {}' WHERE `entry` = 12050; +UPDATE `acore_string` SET `locale_esES` = '{} está bajo ataque por {}', `locale_esMX` = '{} está bajo ataque por {}' WHERE `entry` = 12051; +UPDATE `acore_string` SET `locale_esES` = 'El taller del asedio del Templo Roto', `locale_esMX` = 'El taller del asedio del Templo Roto' WHERE `entry` = 12052; +UPDATE `acore_string` SET `locale_esES` = 'El taller de asedio del Anillo Hundido', `locale_esMX` = 'El taller de asedio del Anillo Hundido' WHERE `entry` = 12055; +UPDATE `acore_string` SET `locale_esES`='Activar o desactivar vuelo instantáneo', `locale_esMX`='Activar o desactivar vuelo instantáneo' WHERE `entry`=30077; +UPDATE `acore_string` SET `locale_esES`='Vuelo instantáneo activado.', `locale_esMX`='Vuelo instantáneo activado.' WHERE `entry`=30078; +UPDATE `acore_string` SET `locale_esES`='Vuelo instantáneo desactivado.', `locale_esMX`='Vuelo instantáneo desactivado.' WHERE `entry`=30079; From 76dd25d751a6176d1744ef351f9dd2af22dd4583 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Mon, 23 Feb 2026 01:31:30 +0000 Subject: [PATCH 049/150] chore(DB): import pending files Referenced commit(s): beca6fef53caa4ccfa504a0bcc68f1e6eacf1913 --- .../rev_1771767222932614900.sql => db_world/2026_02_23_03.sql} | 1 + 1 file changed, 1 insertion(+) rename data/sql/updates/{pending_db_world/rev_1771767222932614900.sql => db_world/2026_02_23_03.sql} (99%) diff --git a/data/sql/updates/pending_db_world/rev_1771767222932614900.sql b/data/sql/updates/db_world/2026_02_23_03.sql similarity index 99% rename from data/sql/updates/pending_db_world/rev_1771767222932614900.sql rename to data/sql/updates/db_world/2026_02_23_03.sql index 1a7de9af1..2a09ecbdd 100644 --- a/data/sql/updates/pending_db_world/rev_1771767222932614900.sql +++ b/data/sql/updates/db_world/2026_02_23_03.sql @@ -1,3 +1,4 @@ +-- DB update 2026_02_23_02 -> 2026_02_23_03 UPDATE `acore_string` SET `locale_esES` = 'El comando ''{}'' no existe.', `locale_esMX` = 'El comando ''{}'' no existe.' WHERE `entry` = 6; UPDATE `acore_string` SET `locale_esES` = 'El subcomando ''{}{}{}'' es ambiguo:', `locale_esMX` = 'El subcomando ''{}{}{}'' es ambiguo:' WHERE `entry` = 7; UPDATE `acore_string` SET `locale_esES` = 'Posibles subcomandos:', `locale_esMX` = 'Posibles subcomandos:' WHERE `entry` = 8; From 40e0a1e5454a4bf55f1f01b1485c9a73837ecfc9 Mon Sep 17 00:00:00 2001 From: blinkysc <37940565+blinkysc@users.noreply.github.com> Date: Sun, 22 Feb 2026 19:44:52 -0600 Subject: [PATCH 050/150] fix(Core/Spells): Fix Kill Command stacks not being consumed (#24822) Co-authored-by: blinkysc --- src/server/scripts/Spells/spell_hunter.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/server/scripts/Spells/spell_hunter.cpp b/src/server/scripts/Spells/spell_hunter.cpp index fa9e2d79e..da98fe256 100644 --- a/src/server/scripts/Spells/spell_hunter.cpp +++ b/src/server/scripts/Spells/spell_hunter.cpp @@ -76,7 +76,7 @@ enum HunterSpells SPELL_HUNTER_RAPID_RECUPERATION_R1 = 56654, SPELL_HUNTER_RAPID_RECUPERATION_R2 = 58882, SPELL_HUNTER_GLYPH_OF_MEND_PET_HAPPINESS = 57894, - SPELL_HUNTER_KILL_COMMAND_HUNTER = 34026, + SPELL_HUNTER_KILL_COMMAND_HUNTER = 34027, SPELL_HUNTER_RAPID_RECUPERATION_MANA_R1 = 56654, SPELL_HUNTER_RAPID_RECUPERATION_MANA_R2 = 58882, SPELL_HUNTER_PIERCING_SHOTS = 63468, From 0faf08c2602023d24348bae938a8cef19463f3b5 Mon Sep 17 00:00:00 2001 From: Gultask <100873791+Gultask@users.noreply.github.com> Date: Sun, 22 Feb 2026 23:26:25 -0300 Subject: [PATCH 051/150] fix(DB/Loot): Cover more WotLK creatures in the Loot Normalization (#24819) --- .../rev_1771805490746014200.sql | 235 ++++++++++++++++++ 1 file changed, 235 insertions(+) create mode 100644 data/sql/updates/pending_db_world/rev_1771805490746014200.sql diff --git a/data/sql/updates/pending_db_world/rev_1771805490746014200.sql b/data/sql/updates/pending_db_world/rev_1771805490746014200.sql new file mode 100644 index 000000000..d2a785586 --- /dev/null +++ b/data/sql/updates/pending_db_world/rev_1771805490746014200.sql @@ -0,0 +1,235 @@ +-- +DELETE FROM `creature_loot_template` WHERE `Entry` IN (24291, 23776, 24104, 26862, 26863, 29885, 27821, 26290, 30492); +UPDATE `creature_template` SET `lootid` = 0 WHERE `Entry` IN (24291, 23776, 24104, 26862, 26863, 29885, 27821, 26290, 30492); + +DELETE FROM `creature_loot_template` WHERE `Entry` IN (24398,24400,31693,24201,24238,24469,25301,25601,25789,25801,25804,26578,26828,26836,27006,27007,27008,27009,27122,27210,27247,27334,27579,27580,27859,28068,28255,29375,29503,29614,29836,30831,30925,31139,31399,32278,32353,24440,25228,25234,25488,28399,29026,29696,29710,31040,32181,23725,23993,24329,24371,24547,24900,24914,25618,26287,26291,26293,26333,26360,26406,26417,26633,26838,26841,26858,27002,27018,27105,27249,27383,27578,27645,27647,27732,27743,27744,27860,28199,28200,28443,28467,28477,28597,28659,28784,28793,29664,30829,30830,30861,30892,30954,31180,31184,31188,31198,31203,31206,31229,31255,31502,32770,32772,40419) AND `Reference` IN (1200067,1200068,1200069,1200071,1200076,1200077,1200078,1200079,1200080,1200170,1200171,1200179,1200180,1200270,1200271,1200272,1200273,1200274,1200275,1200276,1200277,1200279,1200280,1200281,1200282,1200369,1200370,1200371,1200372,1200373,1200374,1200375,1200376,1200377,1200379,1200380,1200381,1200382,1270001,1270002); +INSERT INTO `creature_loot_template` (`Entry`, `Item`, `Reference`, `Chance`, `GroupId`, `Comment`) VALUES +(23725, 1, 1200270, 0, 5, 'Stone Giant - World Loot Level 70'), +(23993, 1, 1200271, 0, 5, 'Sepulchral Overseer - World Loot Level 71'), +(24201, 1, 1200372, 0, 5, 'Dalronn the Controller - World Loot Level 72'), +(24201, 33470, 1270002, 25, 0, 'Dalronn the Controller - Frostweave Cloth Elite'), +(24238, 1, 1200370, 0, 5, 'Bjorn Halgurdsson - World Loot Level 70'), +(24238, 33470, 1270002, 25, 0, 'Bjorn Halgurdsson - Frostweave Cloth Elite'), +(24329, 1, 1200270, 0, 5, 'Runed Stone Giant - World Loot Level 70'), +(24371, 1, 1200271, 0, 5, 'Megalith - World Loot Level 71'), +(24398, 1, 1200171, 0, 5, 'Steel Gate Excavator - World Loot Level 71'), +(24398, 33470, 1270001, 25, 0, 'Steel Gate Excavator - Frostweave Cloth Normal'), +(24400, 1, 1200170, 0, 5, 'Steel Gate Archaeologist - World Loot Level 70'), +(24400, 2, 1200171, 0, 5, 'Steel Gate Archaeologist - World Loot Level 71'), +(24400, 33470, 1270001, 25, 0, 'Steel Gate Archaeologist - Frostweave Cloth Normal'), +(24440, 1, 1200071, 0, 5, 'Gjalerbron Gargoyle - World Loot Level 71'), +(24469, 1, 1200369, 0, 5, 'Magnataur Huntress - World Loot Level 69'), +(24469, 33470, 1270002, 25, 0, 'Magnataur Huntress - Frostweave Cloth Elite'), +(24547, 1, 1200271, 0, 5, 'Hozzer - World Loot Level 71'), +(24900, 1, 1200272, 0, 5, 'Abdul the Insane - World Loot Level 72'), +(24914, 1, 1200280, 0, 5, 'Sorlof - World Loot Level 80'), +(25228, 1, 1200069, 0, 5, 'Risen Crypt Lord - World Loot Level 69'), +(25234, 1, 1200068, 0, 5, 'Stormfleet Deckhand - World Loot Level 68'), +(25234, 2, 1200069, 0, 5, 'Stormfleet Deckhand - World Loot Level 69'), +(25301, 1, 1200372, 0, 5, 'Counselor Talbot - World Loot Level 72'), +(25301, 33470, 1270002, 25, 0, 'Counselor Talbot - Frostweave Cloth Elite'), +(25488, 1, 1200068, 0, 5, 'Wooly Rhino Calf - World Loot Level 68'), +(25601, 1, 1200372, 0, 5, 'Prince Valanar - World Loot Level 72'), +(25601, 33470, 1270002, 25, 0, 'Prince Valanar - Frostweave Cloth Elite'), +(25618, 1, 1200270, 0, 5, 'Varidus the Flenser - World Loot Level 70'), +(25789, 1, 1200371, 0, 5, 'Gammothra the Tormentor - World Loot Level 71'), +(25789, 33470, 1270002, 25, 0, 'Gammothra the Tormentor - Frostweave Cloth Elite'), +(25801, 1, 1200372, 0, 5, 'Nedar, Lord of Rhinos - World Loot Level 72'), +(25801, 33470, 1270002, 25, 0, 'Nedar, Lord of Rhinos - Frostweave Cloth Elite'), +(25804, 1, 1200372, 0, 5, 'Harold Lane - World Loot Level 72'), +(25804, 33470, 1270002, 25, 0, 'Harold Lane - Frostweave Cloth Elite'), +(26287, 1, 1200273, 0, 5, 'Icestorm - World Loot Level 73'), +(26291, 1, 1200273, 0, 5, 'Crystalline Ice Giant - World Loot Level 73'), +(26291, 2, 1200274, 0, 5, 'Crystalline Ice Giant - World Loot Level 74'), +(26293, 1, 1200273, 0, 5, 'Hulking Jormungar - World Loot Level 73'), +(26293, 2, 1200274, 0, 5, 'Hulking Jormungar - World Loot Level 74'), +(26333, 1, 1200271, 0, 5, 'Corrupted Lothalor Ancient - World Loot Level 71'), +(26333, 2, 1200272, 0, 5, 'Corrupted Lothalor Ancient - World Loot Level 72'), +(26360, 1, 1200274, 0, 5, 'Rattlebore - World Loot Level 74'), +(26406, 1, 1200274, 0, 5, 'The Anvil - World Loot Level 74'), +(26417, 1, 1200274, 0, 5, 'Runed Giant - World Loot Level 74'), +(26417, 2, 1200275, 0, 5, 'Runed Giant - World Loot Level 75'), +(26578, 1, 1200374, 0, 5, 'Mistress of the Coldwind - World Loot Level 74'), +(26578, 33470, 1270002, 25, 0, 'Mistress of the Coldwind - Frostweave Cloth Elite'), +(26633, 1, 1200275, 0, 5, 'Ursoc - World Loot Level 75'), +(26828, 1, 1200374, 0, 5, 'Magister Keldonus - World Loot Level 74'), +(26828, 33470, 1270002, 25, 0, 'Magister Keldonus - Frostweave Cloth Elite'), +(26836, 1, 1200374, 0, 5, 'Gigantaur - World Loot Level 74'), +(26836, 33470, 1270002, 25, 0, 'Gigantaur - Frostweave Cloth Elite'), +(26838, 1, 1200274, 0, 5, 'Dreadtalon - World Loot Level 74'), +(26841, 1, 1200273, 0, 5, 'Reanimated Frost Wyrm - World Loot Level 73'), +(26841, 2, 1200274, 0, 5, 'Reanimated Frost Wyrm - World Loot Level 74'), +(26858, 1, 1200275, 0, 5, 'Sarathstra - World Loot Level 75'), +(27002, 1, 1200274, 0, 5, 'Grom\'thar the Thunderbringer - World Loot Level 74'), +(27006, 1, 1200373, 0, 5, 'Bonesunder - World Loot Level 73'), +(27006, 33470, 1270002, 25, 0, 'Bonesunder - Frostweave Cloth Elite'), +(27007, 1, 1200373, 0, 5, 'Iceshatter - World Loot Level 73'), +(27007, 33470, 1270002, 25, 0, 'Iceshatter - Frostweave Cloth Elite'), +(27008, 1, 1200373, 0, 5, 'Bloodfeast - World Loot Level 73'), +(27008, 33470, 1270002, 25, 0, 'Bloodfeast - Frostweave Cloth Elite'), +(27009, 1, 1200373, 0, 5, 'Drakegore - World Loot Level 73'), +(27009, 33470, 1270002, 25, 0, 'Drakegore - Frostweave Cloth Elite'), +(27018, 1, 1200275, 0, 5, 'Shade of Arugal - World Loot Level 75'), +(27105, 1, 1200273, 0, 5, 'Kreug Oathbreaker - World Loot Level 73'), +(27122, 1, 1200374, 0, 5, 'Overseer Deathgaze - World Loot Level 74'), +(27122, 33470, 1270002, 25, 0, 'Overseer Deathgaze - Frostweave Cloth Elite'), +(27210, 1, 1200372, 0, 5, 'High General Abbendis - World Loot Level 72'), +(27210, 33470, 1270002, 25, 0, 'High General Abbendis - Frostweave Cloth Elite'), +(27247, 1, 1200372, 0, 5, 'Devout Bodyguard - World Loot Level 72'), +(27247, 33470, 1270002, 25, 0, 'Devout Bodyguard - Frostweave Cloth Elite'), +(27249, 1, 1200274, 0, 5, 'Alystros the Verdant Keeper - World Loot Level 74'), +(27334, 1, 1200374, 0, 5, 'Onslaught Commander Iustus - World Loot Level 74'), +(27334, 33470, 1270002, 25, 0, 'Onslaught Commander Iustus - Frostweave Cloth Elite'), +(27383, 1, 1200273, 0, 5, 'Thel\'zan the Duskbringer - World Loot Level 73'), +(27578, 1, 1200275, 0, 5, 'Goremaw - World Loot Level 75'), +(27579, 1, 1200375, 0, 5, 'Varlam - World Loot Level 75'), +(27579, 33470, 1270002, 25, 0, 'Varlam - Frostweave Cloth Elite'), +(27580, 1, 1200375, 0, 5, 'Selas - World Loot Level 75'), +(27580, 33470, 1270002, 25, 0, 'Selas - Frostweave Cloth Elite'), +(27645, 1, 1200279, 0, 5, 'Phantasmal Cloudscraper - World Loot Level 79'), +(27647, 1, 1200279, 0, 5, 'Phantasmal Ogre - World Loot Level 79'), +(27732, 1, 1200280, 0, 5, 'Master Necromancer - World Loot Level 80'), +(27743, 1, 1200279, 0, 5, 'Infinite Hunter - World Loot Level 79'), +(27743, 2, 1200280, 0, 5, 'Infinite Hunter - World Loot Level 80'), +(27744, 1, 1200279, 0, 5, 'Infinite Agent - World Loot Level 79'), +(27744, 2, 1200280, 0, 5, 'Infinite Agent - World Loot Level 80'), +(27859, 1, 1200372, 0, 5, 'Vanthryn the Merciless - World Loot Level 72'), +(27859, 33470, 1270002, 25, 0, 'Vanthryn the Merciless - Frostweave Cloth Elite'), +(27860, 1, 1200272, 0, 5, 'Luthion the Vile - World Loot Level 72'), +(28068, 1, 1200376, 0, 5, 'Prophet of Sseratus - World Loot Level 76'), +(28068, 33470, 1270002, 25, 0, 'Prophet of Sseratus - Frostweave Cloth Elite'), +(28199, 1, 1200279, 0, 5, 'Tomb Stalker - World Loot Level 79'), +(28199, 2, 1200280, 0, 5, 'Tomb Stalker - World Loot Level 80'), +(28200, 1, 1200279, 0, 5, 'Dark Necromancer - World Loot Level 79'), +(28200, 2, 1200280, 0, 5, 'Dark Necromancer - World Loot Level 80'), +(28255, 1, 1200376, 0, 5, 'Malas the Corrupter - World Loot Level 76'), +(28255, 33470, 1270002, 25, 0, 'Malas the Corrupter - Frostweave Cloth Elite'), +(28399, 1, 1200077, 0, 5, 'Zeptek the Destroyer - World Loot Level 77'), +(28443, 1, 1200277, 0, 5, 'Thalgran Blightbringer - World Loot Level 77'), +(28467, 1, 1200277, 0, 5, 'Broodmother Slivina - World Loot Level 77'), +(28477, 1, 1200276, 0, 5, 'Scion of Quetz\'lun - World Loot Level 76'), +(28477, 2, 1200277, 0, 5, 'Scion of Quetz\'lun - World Loot Level 77'), +(28597, 1, 1200276, 0, 5, 'Guardian of Zim\'Rhuk - World Loot Level 76'), +(28597, 2, 1200277, 0, 5, 'Guardian of Zim\'Rhuk - World Loot Level 77'), +(28659, 1, 1200277, 0, 5, 'Artruis the Heartless - World Loot Level 77'), +(28784, 1, 1200276, 0, 5, 'Altar Warden - World Loot Level 76'), +(28784, 2, 1200277, 0, 5, 'Altar Warden - World Loot Level 77'), +(28793, 1, 1200276, 0, 5, 'Darmuk - World Loot Level 76'), +(29026, 1, 1200076, 0, 5, 'Kolramas Slime - World Loot Level 76'), +(29375, 1, 1200380, 0, 5, 'Stormforged Iron Giant - World Loot Level 80'), +(29375, 33470, 1270002, 25, 0, 'Stormforged Iron Giant - Frostweave Cloth Elite'), +(29503, 1, 1200379, 0, 5, 'Fjorn - World Loot Level 79'), +(29503, 2, 1200380, 0, 5, 'Fjorn - World Loot Level 80'), +(29503, 33470, 1270002, 25, 0, 'Fjorn - Frostweave Cloth Elite'), +(29614, 1, 1200379, 0, 5, 'Onslaught Darkweaver - World Loot Level 79'), +(29614, 2, 1200380, 0, 5, 'Onslaught Darkweaver - World Loot Level 80'), +(29614, 33470, 1270002, 25, 0, 'Onslaught Darkweaver - Frostweave Cloth Elite'), +(29664, 1, 1200275, 0, 5, 'Ragemane - World Loot Level 75'), +(29696, 1, 1200079, 0, 5, 'Stormforged Pursuer - World Loot Level 79'), +(29696, 2, 1200080, 0, 5, 'Stormforged Pursuer - World Loot Level 80'), +(29710, 1, 1200078, 0, 5, 'Onslaught Destrier - World Loot Level 78'), +(29710, 2, 1200079, 0, 5, 'Onslaught Destrier - World Loot Level 79'), +(29836, 1, 1200377, 0, 5, 'Drakkari Battle Rider - World Loot Level 77'), +(29836, 33470, 1270002, 25, 0, 'Drakkari Battle Rider - Frostweave Cloth Elite'), +(30829, 1, 1200279, 0, 5, 'Salranax the Flesh Render - World Loot Level 79'), +(30830, 1, 1200279, 0, 5, 'Underking Talonox - World Loot Level 79'), +(30831, 1, 1200379, 0, 5, 'High Priest Yath\'amon - World Loot Level 79'), +(30831, 33470, 1270002, 25, 0, 'High Priest Yath\'amon - Frostweave Cloth Elite'), +(30861, 1, 1200280, 0, 5, 'Unbound Ancient - World Loot Level 80'), +(30892, 1, 1200276, 0, 5, 'Portal Guardian - World Loot Level 76'), +(30925, 1, 1200380, 0, 5, 'Drakkari Battle Rider (1) - World Loot Level 80'), +(30925, 2, 1200381, 0, 5, 'Drakkari Battle Rider (1) - World Loot Level 81'), +(30925, 33470, 1270002, 25, 0, 'Drakkari Battle Rider (1) - Frostweave Cloth Elite'), +(30954, 1, 1200280, 0, 5, 'Rokir - World Loot Level 80'), +(31040, 1, 1200077, 0, 5, 'Wrathstrike Gargoyle - World Loot Level 77'), +(31040, 2, 1200078, 0, 5, 'Wrathstrike Gargoyle - World Loot Level 78'), +(31139, 1, 1200381, 0, 5, 'Pustulent Horror - World Loot Level 81'), +(31139, 2, 1200382, 0, 5, 'Pustulent Horror - World Loot Level 82'), +(31139, 33470, 1270002, 25, 0, 'Pustulent Horror - Frostweave Cloth Elite'), +(31180, 1, 1200280, 0, 5, 'Master Necromancer (1) - World Loot Level 80'), +(31184, 1, 1200280, 0, 5, 'Dark Necromancer (1) - World Loot Level 80'), +(31188, 1, 1200280, 0, 5, 'Tomb Stalker (1) - World Loot Level 80'), +(31198, 1, 1200282, 0, 5, 'Coprous the Defiled - World Loot Level 82'), +(31203, 1, 1200280, 0, 5, 'Infinite Agent (1) - World Loot Level 80'), +(31206, 1, 1200280, 0, 5, 'Infinite Hunter (1) - World Loot Level 80'), +(31229, 1, 1200280, 0, 5, 'Ancient Watcher - World Loot Level 80'), +(31255, 1, 1200280, 0, 5, 'Saronite Shaper - World Loot Level 80'), +(31399, 1, 1200380, 0, 5, 'Foreman Thaldrin - World Loot Level 80'), +(31399, 33470, 1270002, 25, 0, 'Foreman Thaldrin - Frostweave Cloth Elite'), +(31502, 1, 1200281, 0, 5, 'Portal Guardian (1) - World Loot Level 81'), +(31693, 1, 1200179, 0, 5, 'Stormforged Saboteur - World Loot Level 79'), +(31693, 2, 1200180, 0, 5, 'Stormforged Saboteur - World Loot Level 80'), +(31693, 33470, 1270001, 25, 0, 'Stormforged Saboteur - Frostweave Cloth Normal'), +(32181, 1, 1200080, 0, 5, 'Living Plague - World Loot Level 80'), +(32278, 1, 1200380, 0, 5, 'Harbinger of Horror - World Loot Level 80'), +(32278, 33470, 1270002, 25, 0, 'Harbinger of Horror - Frostweave Cloth Elite'), +(32353, 1, 1200380, 0, 5, 'Archavon Warder - World Loot Level 80'), +(32353, 33470, 1270002, 25, 0, 'Archavon Warder - Frostweave Cloth Elite'), +(32770, 1, 1200280, 0, 5, 'Enraged Fleshrender - World Loot Level 80'), +(32772, 1, 1200280, 0, 5, 'Skeletal Footsoldier - World Loot Level 80'), +(40419, 1, 1200282, 0, 5, 'Charscale Assaulter - World Loot Level 82'); + +-- Loose Items +DELETE FROM `creature_loot_template` +WHERE `Item` IN (33358,33359,33360,33361,33362,33363,33364,33372,33373,33374,33375,33376,33377,33378,33390,33391,33392,33393,33394,33395,33396,33404,33405,33406,33407,33408,33409,33410,33422,33423,33424,33425,33426,33427,33428,33429,33430,33431,33437,33438,33439,33440,33365,33366,33367,33368,33369,33370,33371,33379,33380,33381,33382,33383,33384,33385,33397,33398,33399,33400,33401,33402,33403,33412,33413,33414,33415,33416,33417,33419,33433,33434,33435,33436,35955,35956,35957,35958,35959,35960,35961,35962,36067,36068,36069,36070,36071,36072,36073,36074,36179,36180,36181,36182,36183,36184,36185,36186,36291,36292,36293,36294,36295,36296,36297,36298,36403,36417,36431,36445,36459,36473,36487,36501,36515,36529,36543,36557,36571,36585,36599,36613,36627,36641,36655,36669,36683,36697,36711,35963,35964,35965,35966,35967,35968,35969,35970,36075,36076,36077,36078,36079,36080,36081,36082,36187,36188,36189,36190,36191,36192,36193,36194,36299,36300,36301,36302,36303,36304,36305,36306,36404,36418,36432,36446,36460,36474,36488,36502,36516,36530,36544,36558,36572,36586,36600,36614,36628,36642,36656,36670,36684,36698,36712,35971,35972,35973,35974,35975,35976,35977,35978,36083,36084,36085,36086,36087,36088,36089,36090,36195,36196,36197,36198,36199,36200,36201,36202,36307,36308,36309,36310,36311,36312,36313,36314,36405,36419,36433,36447,36461,36475,36489,36503,36517,36531,36545,36559,36573,36587,36601,36615,36629,36643,36657,36671,36685,36699,36713,35979,35980,35981,35982,35983,35984,35985,35986,36091,36092,36093,36094,36095,36096,36097,36098,36203,36204,36205,36206,36207,36208,36209,36210,36315,36316,36317,36318,36319,36320,36321,36322,36406,36420,36434,36448,36462,36476,36490,36504,36518,36532,36546,36560,36574,36588,36602,36616,36630,36644,36658,36672,36686,36700,36714,35987,35988,35989,35990,35991,35992,35993,35994,36099,36100,36101,36102,36103,36104,36105,36106,36211,36212,36213,36214,36215,36216,36217,36218,36323,36324,36325,36326,36327,36328,36329,36330,36407,36421,36435,36449,36463,35995,35996,35997,35998,35999,36000,36001,36002,36107,36108,36109,36110,36111,36112,36113,36114,36219,36220,36221,36222,36223,36224,36225,36226,36331,36332,36333,36334,36335,36336,36337,36338,36408,36422,36436,36450,36464,36478,36492,36506,36520,36534,36548,36562,36576,36590,36604,36618,36632,36646,36660,36674,36688,36702,36716,36003,36004,36005,36006,36007,36008,36009,36010,36115,36116,36117,36118,36119,36120,36121,36122,36227,36228,36229,36230,36231,36232,36233,36234,36339,36340,36341,36342,36343,36344,36345,36346,36409,36423,36437,36451,36465,36479,36493,36507,36521,36535,36549,36563,36577,36591,36605,36619,36633,36647,36661,36675,36689,36703,36717,36011,36012,36013,36014,36015,36016,36017,36018,36123,36124,36125,36126,36127,36128,36129,36130,36235,36236,36237,36238,36239,36240,36241,36242,36347,36348,36349,36350,36351,36352,36353,36354,36410,36424,36438,36452,36466,36480,36494,36508,36522,36536,36550,36564,36578,36592,36606,36620,36634,36648,36662,36676,36690,36704,36718,36019,36020,36021,36022,36023,36024,36025,36026,36131,36132,36133,36134,36135,36136,36137,36138,36243,36244,36245,36246,36247,36248,36249,36250,36355,36356,36357,36358,36359,36360,36361,36362,36411,36425,36439,36453,36467,36481,36495,36509,36523,36537,36551,36565,36579,36593,36607,36621,36635,36649,36663,36677,36691,36705,36719,36027,36028,36029,36030,36031,36032,36033,36034,36139,36140,36141,36142,36143,36144,36145,36146,36251,36252,36253,36254,36255,36256,36257,36258,36363,36364,36365,36366,36367,36368,36369,36370,36412,36426,36440,36468,36482,36496,36510,36524,36538,36552,36566,36580,36594,36608,36622,36636,36650,36664,36678,36692,36706,36720,36035,36036,36037,36038,36039,36040,36041,36042,36147,36148,36149,36150,36151,36152,36153,36154,36259,36260,36261,36262,36263,36264,36265,36266,36371,36372,36373,36374,36375,36376,36377,36378,36413,36427,36441,36455,36469,36483,36497,36511,36525,36539,36553,36567,36581,36595,36609,36623,36637,36651,36665,36679,36693,36707,36721,36043,36044,36045,36046,36047,36048,36049,36050,36155,36156,36157,36158,36159,36160,36161,36162,36267,36268,36269,36270,36271,36272,36273,36274,36379,36380,36381,36382,36383,36384,36385,36386,36414,36428,36442,36456,36470,36484,36498,36512,36526,36540,36554,36568,36582,36596,36610,36624,36638,36652,36666,36680,36694,36708,36722,36051,36052,36053,36054,36055,36056,36057,36058,36163,36164,36165,36166,36167,36168,36169,36170,36275,36276,36277,36278,36279,36280,36281,36282,36387,36388,36389,36390,36391,36392,36393,36394,36415,36429,36443,36457,36471,36485,36499,36513,36527,36541,36555,36569,36583,36597,36611,36625,36639,36653,36667,36681,36695,36709,36723,36059,36060,36061,36062,36063,36064,36065,36066,36171,36172,36173,36174,36175,36176,36177,36178,36283,36284,36285,36286,36287,36288,36289,36290,36395,36396,36397,36398,36399,36400,36401,36402,36416,36430,36444,36458,36472,36486,36500,36514,36528,36542,36556,36570,36584,36598,36612,36626,36640,36654,36668,36682,36696,36710,36724,37743,37744,37745,37746,37747,37748,37749,37751,37752,37762,37772,37782,37753,37763,37773,37783,37803,37819,37754,37764,37774,37795,37796,37820,37755,37775,37785,37802,37811,37817,37756,37765,37776,37786,37807,37821,37757,37766,37777,37787,37805,37813,37758,37767,37778,37789,37804,37810,37812,37759,37768,37790,37806,37808,37809,37769,37779,37792,37797,37823,37760,37770,37780,37793,37822,37761,37771,37781,37794,37824,37254,37835,43573,44308,44309,44310,44311,44312,44313,22829,22832,37091,37093,37097,43463,43465,43467,33447,33448,43507,43508,43509,43510,43622,43876,39152,41777,41778,41779,41780,41781,41782,41783,41784,41785,41786,41787,41788,41789,42172,42173,42175,42176,42177,42178,43297,43624,45912,33470) +AND `Entry` IN (24398,24400,31693,24201,24238,24469,25301,25601,25789,25801,25804,26578,26828,26836,27006,27007,27008,27009,27122,27210,27247,27334,27579,27580,27859,28068,28255,29375,29503,29614,29836,30831,30925,31139,31399,32278,32353,24440,25228,25234,25488,28399,29026,29696,29710,31040,32181,23725,23993,24329,24371,24547,24900,24914,25618,26287,26291,26293,26333,26360,26406,26417,26633,26838,26841,26858,27002,27018,27105,27249,27383,27578,27645,27647,27732,27743,27744,27860,28199,28200,28443,28467,28477,28597,28659,28784,28793,29664,30829,30830,30861,30892,30954,31180,31184,31188,31198,31203,31206,31229,31255,31502,32770,32772,40419) AND `Reference` = 0; +-- Delete Legacy References +DELETE FROM `creature_loot_template` WHERE +`Entry` IN (24398,24400,31693,24201,24238,24469,25301,25601,25789,25801,25804,26578,26828,26836,27006,27007,27008,27009,27122,27210,27247,27334,27579,27580,27859,28068,28255,29375,29503,29614,29836,30831,30925,31139,31399,32278,32353,24440,25228,25234,25488,28399,29026,29696,29710,31040,32181,23725,23993,24329,24371,24547,24900,24914,25618,26287,26291,26293,26333,26360,26406,26417,26633,26838,26841,26858,27002,27018,27105,27249,27383,27578,27645,27647,27732,27743,27744,27860,28199,28200,28443,28467,28477,28597,28659,28784,28793,29664,30829,30830,30861,30892,30954,31180,31184,31188,31198,31203,31206,31229,31255,31502,32770,32772,40419) +AND `Reference` IN (26001,26040,26000,24727,26002,26008,26007,26009,26006,26005,26010,26014,26013,26015,26012,26004,26011,26003,26018,26020,26021,26028,26019,26022,26023,26024,26016,26017,26025); + +-- Removes Frostweave Cloth from a boss' Reference +DELETE FROM `reference_loot_template` WHERE (`Entry` = 35045) AND (`Item` IN (33470)); + +DELETE FROM `reference_loot_template` WHERE (`Entry` IN (1200369,1200275,1200282,1200382)); +INSERT INTO `reference_loot_template` (`Entry`, `Item`, `Reference`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES +(1200369, 1, 1206874, 10, 0, 1, 0, 1, 1, 'WotLK Greys 68-74 Level Range'), +(1200369, 2, 1226870, 5, 0, 1, 1, 1, 1, 'WotLK Greens 68-70 Level Range'), +(1200369, 3, 1226971, 5, 0, 1, 1, 1, 1, 'WotLK Greens 69-71 Level Range'), +(1200369, 4, 1236871, 0.1, 0, 1, 0, 1, 1, 'WotLK Blues 68-71 Level Range'), +(1200369, 5, 1266870, 100, 0, 1, 0, 1, 1, 'WotLK Profession Drops 68-70 Level Range'), +(1200369, 6, 1256875, 3, 0, 1, 0, 1, 1, 'WotLK Potions 68-75 Level Range'), +(1200369, 7, 1256883, 1, 0, 1, 0, 1, 1, 'WotLK Scrolls'), + +(1200275, 1, 1207583, 10, 0, 1, 0, 1, 1, 'WotLK Greys 75+ Level Range'), +(1200275, 2, 1227375, 3.33, 0, 1, 1, 1, 1, 'WotLK Greens 73-75 Level Range'), +(1200275, 3, 1227476, 3.33, 0, 1, 1, 1, 1, 'WotLK Greens 74-76 Level Range'), +(1200275, 4, 1227577, 3.33, 0, 1, 1, 1, 1, 'WotLK Greens 75-77 Level Range'), +(1200275, 5, 1237375, 0.033, 0, 1, 2, 1, 1, 'WotLK Blues 73-75 Level Range'), +(1200275, 6, 1237476, 0.033, 0, 1, 2, 1, 1, 'WotLK Blues 74-76 Level Range'), +(1200275, 7, 1237577, 0.033, 0, 1, 2, 1, 1, 'WotLK Blues 75-77 Level Range'), +(1200275, 8, 1267579, 100, 0, 1, 0, 1, 1, 'WotLK Profession Drops 75-79 Level Range'), + +(1200282, 1, 1207583, 10, 0, 1, 0, 1, 1, 'WotLK Greys 75+ Level Range'), +(1200282, 2, 1228082, 5, 0, 1, 1, 1, 1, 'WotLK Greens 80-82 Level Range'), +(1200282, 3, 1228183, 5, 0, 1, 1, 1, 1, 'WotLK Greens 81-83 Level Range'), +(1200282, 4, 1238083, 0.1, 0, 1, 2, 1, 1, 'WotLK Blues 80-83 Level Range'), +(1200282, 5, 1248083, 0.01, 0, 1, 0, 1, 1, 'WotLK Purples 80+ Level Range'), +(1200282, 6, 1268083, 100, 0, 1, 0, 1, 1, 'WotLK Profession Drops 80+ Level Range'), + +(1200382, 1, 1207583, 10, 0, 1, 0, 1, 1, 'WotLK Greys 75+ Level Range'), +(1200382, 2, 1228082, 5, 0, 1, 1, 1, 1, 'WotLK Greens 80-82 Level Range'), +(1200382, 3, 1228183, 5, 0, 1, 1, 1, 1, 'WotLK Greens 81-83 Level Range'), +(1200382, 4, 1238083, 0.1, 0, 1, 2, 1, 1, 'WotLK Blues 80-83 Level Range'), +(1200382, 5, 1248083, 0.01, 0, 1, 0, 1, 1, 'WotLK Purples 80+ Level Range'), +(1200382, 6, 1268083, 100, 0, 1, 0, 1, 1, 'WotLK Profession Drops 80+ Level Range'), +(1200382, 7, 1257683, 3, 0, 1, 0, 1, 1, 'WotLK Potions 76-83 Level Range'), +(1200382, 8, 1256883, 1, 0, 1, 0, 1, 1, 'WotLK Scrolls'); + +DELETE FROM `reference_loot_template` WHERE `Entry` IN (26000,26001,26009,26011,26016,26017,26018,26019,26020,26021,26022,26023,26024,26025,26028); + +DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId` = 1 AND `SourceGroup` IN (24398,24400,31693,24201,24238,24469,25301,25601,25789,25801,25804,26578,26828,26836,27006,27007,27008,27009,27122,27210,27247,27334,27579,27580,27859,28068,28255,29375,29503,29614,29836,30831,30925,31139,31399,32278,32353,24440,25228,25234,25488,28399,29026,29696,29710,31040,32181,23725,23993,24329,24371,24547,24900,24914,25618,26287,26291,26293,26333,26360,26406,26417,26633,26838,26841,26858,27002,27018,27105,27249,27383,27578,27645,27647,27732,27743,27744,27860,28199,28200,28443,28467,28477,28597,28659,28784,28793,29664,30829,30830,30861,30892,30954,31180,31184,31188,31198,31203,31206,31229,31255,31502,32770,32772,40419) +AND `SourceEntry` IN ( +39152, -- Manual: Heavy Frostweave Bandage +42172, -- Pattern: Red Lumberjack Shirt +42173, -- Pattern: Blue Lumberjack Shirt +42175, -- Pattern: Green Lumberjack Shirt +42177, -- Pattern: Red Workman's Shirt +42178, -- Pattern: Rustic Workman's Shirt +43507, -- Recipe: Tasty Cupcake +43508, -- Recipe: Last Week's Mammoth +43509, -- Recipe: Bad Clams +43510 -- Recipe: Haunted Herring +); + +DELETE FROM `conditions` WHERE (`SourceTypeOrReferenceId` = 1) AND (`SourceGroup` = 26863) AND (`SourceEntry` = 43510) AND (`SourceId` = 0) AND (`ElseGroup` = 0) AND (`ConditionTypeOrReference` = 7) AND (`ConditionTarget` = 0) AND (`ConditionValue1` = 185) AND (`ConditionValue2` = 1) AND (`ConditionValue3` = 0); From 80947bf4098ba9cdcd81ef7df9f1728a6fd45d4c Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Mon, 23 Feb 2026 02:27:51 +0000 Subject: [PATCH 052/150] chore(DB): import pending files Referenced commit(s): 0faf08c2602023d24348bae938a8cef19463f3b5 --- .../rev_1771805490746014200.sql => db_world/2026_02_23_04.sql} | 1 + 1 file changed, 1 insertion(+) rename data/sql/updates/{pending_db_world/rev_1771805490746014200.sql => db_world/2026_02_23_04.sql} (99%) diff --git a/data/sql/updates/pending_db_world/rev_1771805490746014200.sql b/data/sql/updates/db_world/2026_02_23_04.sql similarity index 99% rename from data/sql/updates/pending_db_world/rev_1771805490746014200.sql rename to data/sql/updates/db_world/2026_02_23_04.sql index d2a785586..974b48c7f 100644 --- a/data/sql/updates/pending_db_world/rev_1771805490746014200.sql +++ b/data/sql/updates/db_world/2026_02_23_04.sql @@ -1,3 +1,4 @@ +-- DB update 2026_02_23_03 -> 2026_02_23_04 -- DELETE FROM `creature_loot_template` WHERE `Entry` IN (24291, 23776, 24104, 26862, 26863, 29885, 27821, 26290, 30492); UPDATE `creature_template` SET `lootid` = 0 WHERE `Entry` IN (24291, 23776, 24104, 26862, 26863, 29885, 27821, 26290, 30492); From 2d8a1135020b65875f754a5718e5775237d49857 Mon Sep 17 00:00:00 2001 From: Rocco Silipo <108557877+Rorschach91@users.noreply.github.com> Date: Mon, 23 Feb 2026 12:56:36 +0100 Subject: [PATCH 053/150] fix (DB/Condition): Remove pre-requisites for Playing Along quest. (#24825) Co-authored-by: Gultask <100873791+Gultask@users.noreply.github.com> --- data/sql/updates/pending_db_world/Playing_Along.sql | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 data/sql/updates/pending_db_world/Playing_Along.sql diff --git a/data/sql/updates/pending_db_world/Playing_Along.sql b/data/sql/updates/pending_db_world/Playing_Along.sql new file mode 100644 index 000000000..f24dcc253 --- /dev/null +++ b/data/sql/updates/pending_db_world/Playing_Along.sql @@ -0,0 +1,2 @@ +-- Remove conditions +DELETE FROM `conditions` WHERE `SourceEntry` = 12528 AND `SourceTypeOrReferenceId` = 19 AND `ConditionValue1` = 12654; From 57119764a796fbdb1022c91c1f3a89fe4aa565d2 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Mon, 23 Feb 2026 11:57:39 +0000 Subject: [PATCH 054/150] chore(DB): import pending files Referenced commit(s): 2d8a1135020b65875f754a5718e5775237d49857 --- .../Playing_Along.sql => db_world/2026_02_23_05.sql} | 1 + 1 file changed, 1 insertion(+) rename data/sql/updates/{pending_db_world/Playing_Along.sql => db_world/2026_02_23_05.sql} (76%) diff --git a/data/sql/updates/pending_db_world/Playing_Along.sql b/data/sql/updates/db_world/2026_02_23_05.sql similarity index 76% rename from data/sql/updates/pending_db_world/Playing_Along.sql rename to data/sql/updates/db_world/2026_02_23_05.sql index f24dcc253..5208a64c9 100644 --- a/data/sql/updates/pending_db_world/Playing_Along.sql +++ b/data/sql/updates/db_world/2026_02_23_05.sql @@ -1,2 +1,3 @@ +-- DB update 2026_02_23_04 -> 2026_02_23_05 -- Remove conditions DELETE FROM `conditions` WHERE `SourceEntry` = 12528 AND `SourceTypeOrReferenceId` = 19 AND `ConditionValue1` = 12654; From 4277ac0b262b229bf798339c77b1254aedfabf1b Mon Sep 17 00:00:00 2001 From: blinkysc <37940565+blinkysc@users.noreply.github.com> Date: Mon, 23 Feb 2026 12:37:37 -0600 Subject: [PATCH 055/150] fix(Core/Spells): Fix Rapid Recuperation, Rapid Killing, and auto-generate PROC_ATTR_REQ_SPELLMOD (#24830) Co-authored-by: blinkysc --- .../rev_1771855011429365338.sql | 9 ++ .../game/Spells/Auras/SpellAuraEffects.cpp | 6 - src/server/game/Spells/SpellMgr.cpp | 14 ++ src/server/scripts/Spells/spell_hunter.cpp | 49 ++---- .../game/Spells/SpellProcAttributeTest.cpp | 146 ++++++++++++++++++ 5 files changed, 183 insertions(+), 41 deletions(-) create mode 100644 data/sql/updates/pending_db_world/rev_1771855011429365338.sql diff --git a/data/sql/updates/pending_db_world/rev_1771855011429365338.sql b/data/sql/updates/pending_db_world/rev_1771855011429365338.sql new file mode 100644 index 000000000..4d22aeed6 --- /dev/null +++ b/data/sql/updates/pending_db_world/rev_1771855011429365338.sql @@ -0,0 +1,9 @@ +-- Fix spell_script_names for spell_hun_rapid_recuperation +-- Script was moved from talent (53228/53232) to periodic mana aura (56654/58882) +DELETE FROM `spell_script_names` WHERE `ScriptName` = 'spell_hun_rapid_recuperation'; +INSERT INTO `spell_script_names` (`spell_id`, `ScriptName`) VALUES +(56654, 'spell_hun_rapid_recuperation'), +(58882, 'spell_hun_rapid_recuperation'); + +-- Remove explicit Inner Focus spell_proc entry (now auto-generated with PROC_ATTR_REQ_SPELLMOD) +DELETE FROM `spell_proc` WHERE `SpellId` = 14751; diff --git a/src/server/game/Spells/Auras/SpellAuraEffects.cpp b/src/server/game/Spells/Auras/SpellAuraEffects.cpp index 77250413f..1b793832b 100644 --- a/src/server/game/Spells/Auras/SpellAuraEffects.cpp +++ b/src/server/game/Spells/Auras/SpellAuraEffects.cpp @@ -6563,12 +6563,6 @@ void AuraEffect::HandlePeriodicTriggerSpellAuraTick(Unit* target, Unit* caster) caster->CastSpell(target, triggerSpellId, false); return; } - // Hunter - Rapid Recuperation - case 56654: - case 58882: - int32 amount = int32(target->GetMaxPower(POWER_MANA) * GetAmount() / 100.0f); - target->CastCustomSpell(target, triggerSpellId, &amount, nullptr, nullptr, true, nullptr, this); - return; } } diff --git a/src/server/game/Spells/SpellMgr.cpp b/src/server/game/Spells/SpellMgr.cpp index 5751e7fec..a179c1963 100644 --- a/src/server/game/Spells/SpellMgr.cpp +++ b/src/server/game/Spells/SpellMgr.cpp @@ -2073,6 +2073,20 @@ void SpellMgr::LoadSpellProcs() if (addTriggerFlag) procEntry.AttributesMask |= PROC_ATTR_TRIGGERED_CAN_PROC; + // Modifier auras with charges should require spellmod validation + if (spellInfo->ProcCharges) + { + for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i) + { + if (spellInfo->Effects[i].IsAura(SPELL_AURA_ADD_FLAT_MODIFIER) || + spellInfo->Effects[i].IsAura(SPELL_AURA_ADD_PCT_MODIFIER)) + { + procEntry.AttributesMask |= PROC_ATTR_REQ_SPELLMOD; + break; + } + } + } + // Calculate DisableEffectsMask for effects that shouldn't trigger procs uint32 nonProcMask = 0; for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i) diff --git a/src/server/scripts/Spells/spell_hunter.cpp b/src/server/scripts/Spells/spell_hunter.cpp index da98fe256..8a10dede6 100644 --- a/src/server/scripts/Spells/spell_hunter.cpp +++ b/src/server/scripts/Spells/spell_hunter.cpp @@ -73,8 +73,6 @@ enum HunterSpells // Proc system spells SPELL_HUNTER_THRILL_OF_THE_HUNT_MANA = 34720, SPELL_HUNTER_REPLENISHMENT = 57669, - SPELL_HUNTER_RAPID_RECUPERATION_R1 = 56654, - SPELL_HUNTER_RAPID_RECUPERATION_R2 = 58882, SPELL_HUNTER_GLYPH_OF_MEND_PET_HAPPINESS = 57894, SPELL_HUNTER_KILL_COMMAND_HUNTER = 34027, SPELL_HUNTER_RAPID_RECUPERATION_MANA_R1 = 56654, @@ -1403,48 +1401,29 @@ class spell_hun_hunting_party : public AuraScript } }; -// -53228 - Rapid Recuperation +// 56654, 58882 - Rapid Recuperation class spell_hun_rapid_recuperation : public AuraScript { PrepareAuraScript(spell_hun_rapid_recuperation); - bool Validate(SpellInfo const* /*spellInfo*/) override + bool Validate(SpellInfo const* spellInfo) override { - return ValidateSpellInfo({ SPELL_HUNTER_RAPID_RECUPERATION_R1, SPELL_HUNTER_RAPID_RECUPERATION_R2 }); + return ValidateSpellInfo({ spellInfo->Effects[EFFECT_0].TriggerSpell }); } - bool CheckProc(ProcEventInfo& eventInfo) - { - SpellInfo const* procSpell = eventInfo.GetSpellInfo(); - if (!procSpell) - return false; - - // This effect only from Rapid Killing (mana regen) - return (procSpell->SpellFamilyFlags[1] & 0x01000000) != 0; - } - - void HandleProc(ProcEventInfo& /*eventInfo*/) + void HandlePeriodic(AuraEffect const* aurEff) { PreventDefaultAction(); - uint32 triggeredSpell = 0; - switch (GetSpellInfo()->Id) - { - case 53228: // Rank 1 - triggeredSpell = SPELL_HUNTER_RAPID_RECUPERATION_R1; - break; - case 53232: // Rank 2 - triggeredSpell = SPELL_HUNTER_RAPID_RECUPERATION_R2; - break; - default: - return; - } - GetTarget()->CastSpell(GetTarget(), triggeredSpell, true); + + Unit* target = GetTarget(); + uint32 triggerSpellId = GetSpellInfo()->Effects[aurEff->GetEffIndex()].TriggerSpell; + int32 amount = CalculatePct(static_cast(target->GetMaxPower(POWER_MANA)), aurEff->GetAmount()); + target->CastCustomSpell(target, triggerSpellId, &amount, nullptr, nullptr, true, nullptr, aurEff); } void Register() override { - DoCheckProc += AuraCheckProcFn(spell_hun_rapid_recuperation::CheckProc); - OnProc += AuraProcFn(spell_hun_rapid_recuperation::HandleProc); + OnEffectPeriodic += AuraEffectPeriodicFn(spell_hun_rapid_recuperation::HandlePeriodic, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL); } }; @@ -1522,7 +1501,7 @@ class spell_hun_kill_command_pet : public AuraScript } }; -// -53228 - Rapid Recuperation (trigger) +// -53228 - Rapid Recuperation (talent aura) class spell_hun_rapid_recuperation_trigger : public AuraScript { PrepareAuraScript(spell_hun_rapid_recuperation_trigger); @@ -1559,8 +1538,8 @@ class spell_hun_rapid_recuperation_trigger : public AuraScript return; uint8 rank = GetSpellInfo()->GetRank(); - if (rank > 0 && rank <= 2) - GetTarget()->CastSpell(GetTarget(), triggerSpells[rank - 1], true, nullptr, aurEff); + uint32 spellId = triggerSpells[rank - 1]; + eventInfo.GetActor()->CastSpell(eventInfo.GetActor(), spellId, true, nullptr, aurEff); } void Register() override @@ -1676,9 +1655,9 @@ void AddSC_hunter_spell_scripts() RegisterSpellScript(spell_hun_explosive_shot); RegisterSpellScript(spell_hun_thrill_of_the_hunt); RegisterSpellScript(spell_hun_hunting_party); - RegisterSpellScript(spell_hun_rapid_recuperation); RegisterSpellScript(spell_hun_glyph_of_mend_pet); // Proc system scripts + RegisterSpellScript(spell_hun_rapid_recuperation); RegisterSpellScript(spell_hun_kill_command_pet); RegisterSpellScript(spell_hun_piercing_shots); RegisterSpellScript(spell_hun_rapid_recuperation_trigger); diff --git a/src/test/server/game/Spells/SpellProcAttributeTest.cpp b/src/test/server/game/Spells/SpellProcAttributeTest.cpp index 536c105d8..1b6609881 100644 --- a/src/test/server/game/Spells/SpellProcAttributeTest.cpp +++ b/src/test/server/game/Spells/SpellProcAttributeTest.cpp @@ -31,6 +31,7 @@ #include "ProcChanceTestHelper.h" #include "ProcEventInfoHelper.h" +#include "SpellInfoTestHelper.h" #include "AuraStub.h" #include "UnitStub.h" #include "gtest/gtest.h" @@ -135,6 +136,151 @@ TEST_F(SpellProcAttributeTest, ReqSpellmod_AttributeNotSet) EXPECT_FALSE(procEntry.AttributesMask & PROC_ATTR_REQ_SPELLMOD); } +// ============================================================================= +// PROC_ATTR_REQ_SPELLMOD Auto-Generation Tests +// Validates that LoadSpellProcs auto-generates REQ_SPELLMOD for modifier +// auras with charges, preventing charge consumption by unrelated spells. +// ============================================================================= + +namespace +{ + // Replicates the auto-generation logic from SpellMgr::LoadSpellProcs + void ApplyAutoGeneratedSpellmodFlag(SpellInfo const* spellInfo, SpellProcEntry& procEntry) + { + if (spellInfo->ProcCharges) + { + for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i) + { + if (spellInfo->Effects[i].IsAura(SPELL_AURA_ADD_FLAT_MODIFIER) || + spellInfo->Effects[i].IsAura(SPELL_AURA_ADD_PCT_MODIFIER)) + { + procEntry.AttributesMask |= PROC_ATTR_REQ_SPELLMOD; + break; + } + } + } + } +} + +TEST_F(SpellProcAttributeTest, ReqSpellmod_AutoGen_PctModifierWithCharges) +{ + // Rapid Killing (35099): ADD_PCT_MODIFIER + 1 charge + auto spellInfo = SpellInfoBuilder() + .WithId(35099) + .WithEffect(0, SPELL_EFFECT_APPLY_AURA, SPELL_AURA_ADD_PCT_MODIFIER) + .WithProcFlags(PROC_FLAG_DONE_RANGED_AUTO_ATTACK | PROC_FLAG_DONE_SPELL_RANGED_DMG_CLASS) + .WithProcCharges(1) + .BuildUnique(); + + SpellProcEntry procEntry = SpellProcEntryBuilder() + .WithProcFlags(PROC_FLAG_DONE_RANGED_AUTO_ATTACK | PROC_FLAG_DONE_SPELL_RANGED_DMG_CLASS) + .WithCharges(1) + .WithChance(100.0f) + .Build(); + + ApplyAutoGeneratedSpellmodFlag(spellInfo.get(), procEntry); + + EXPECT_TRUE(procEntry.AttributesMask & PROC_ATTR_REQ_SPELLMOD); +} + +TEST_F(SpellProcAttributeTest, ReqSpellmod_AutoGen_FlatModifierWithCharges) +{ + // Clearcasting-like: ADD_FLAT_MODIFIER + charges + auto spellInfo = SpellInfoBuilder() + .WithId(12345) + .WithEffect(0, SPELL_EFFECT_APPLY_AURA, SPELL_AURA_ADD_FLAT_MODIFIER) + .WithProcCharges(2) + .BuildUnique(); + + SpellProcEntry procEntry = SpellProcEntryBuilder() + .WithCharges(2) + .WithChance(100.0f) + .Build(); + + ApplyAutoGeneratedSpellmodFlag(spellInfo.get(), procEntry); + + EXPECT_TRUE(procEntry.AttributesMask & PROC_ATTR_REQ_SPELLMOD); +} + +TEST_F(SpellProcAttributeTest, ReqSpellmod_AutoGen_NoCharges_NotSet) +{ + // Modifier aura without charges should NOT get the flag + auto spellInfo = SpellInfoBuilder() + .WithId(12345) + .WithEffect(0, SPELL_EFFECT_APPLY_AURA, SPELL_AURA_ADD_PCT_MODIFIER) + .WithProcCharges(0) + .BuildUnique(); + + SpellProcEntry procEntry = SpellProcEntryBuilder() + .WithCharges(0) + .WithChance(100.0f) + .Build(); + + ApplyAutoGeneratedSpellmodFlag(spellInfo.get(), procEntry); + + EXPECT_FALSE(procEntry.AttributesMask & PROC_ATTR_REQ_SPELLMOD); +} + +TEST_F(SpellProcAttributeTest, ReqSpellmod_AutoGen_NonModifierWithCharges_NotSet) +{ + // Non-modifier aura with charges should NOT get the flag + auto spellInfo = SpellInfoBuilder() + .WithId(12345) + .WithEffect(0, SPELL_EFFECT_APPLY_AURA, SPELL_AURA_PROC_TRIGGER_SPELL) + .WithProcCharges(1) + .BuildUnique(); + + SpellProcEntry procEntry = SpellProcEntryBuilder() + .WithCharges(1) + .WithChance(100.0f) + .Build(); + + ApplyAutoGeneratedSpellmodFlag(spellInfo.get(), procEntry); + + EXPECT_FALSE(procEntry.AttributesMask & PROC_ATTR_REQ_SPELLMOD); +} + +TEST_F(SpellProcAttributeTest, ReqSpellmod_AutoGen_ModifierOnSecondEffect) +{ + // Modifier on effect index 1, not 0 + auto spellInfo = SpellInfoBuilder() + .WithId(12345) + .WithEffect(0, SPELL_EFFECT_APPLY_AURA, SPELL_AURA_PROC_TRIGGER_SPELL) + .WithEffect(1, SPELL_EFFECT_APPLY_AURA, SPELL_AURA_ADD_FLAT_MODIFIER) + .WithProcCharges(1) + .BuildUnique(); + + SpellProcEntry procEntry = SpellProcEntryBuilder() + .WithCharges(1) + .WithChance(100.0f) + .Build(); + + ApplyAutoGeneratedSpellmodFlag(spellInfo.get(), procEntry); + + EXPECT_TRUE(procEntry.AttributesMask & PROC_ATTR_REQ_SPELLMOD); +} + +TEST_F(SpellProcAttributeTest, ReqSpellmod_AutoGen_PreservesExistingAttributes) +{ + // Should OR with existing attributes, not replace + auto spellInfo = SpellInfoBuilder() + .WithId(12345) + .WithEffect(0, SPELL_EFFECT_APPLY_AURA, SPELL_AURA_ADD_PCT_MODIFIER) + .WithProcCharges(1) + .BuildUnique(); + + SpellProcEntry procEntry = SpellProcEntryBuilder() + .WithCharges(1) + .WithChance(100.0f) + .WithAttributesMask(PROC_ATTR_TRIGGERED_CAN_PROC) + .Build(); + + ApplyAutoGeneratedSpellmodFlag(spellInfo.get(), procEntry); + + EXPECT_TRUE(procEntry.AttributesMask & PROC_ATTR_REQ_SPELLMOD); + EXPECT_TRUE(procEntry.AttributesMask & PROC_ATTR_TRIGGERED_CAN_PROC); +} + // ============================================================================= // PROC_ATTR_USE_STACKS_FOR_CHARGES (0x10) Tests // ============================================================================= From d0f4ef26b797ac486eefaf1db7148cd8cbb38b78 Mon Sep 17 00:00:00 2001 From: blinkysc <37940565+blinkysc@users.noreply.github.com> Date: Mon, 23 Feb 2026 12:38:17 -0600 Subject: [PATCH 056/150] chore(Core/Spells): Remove duplicate seed of corruption spellscript (#24831) Co-authored-by: blinkysc --- .../rev_1771866173424640746.sql | 1 + src/server/scripts/Spells/spell_warlock.cpp | 123 ------------------ 2 files changed, 1 insertion(+), 123 deletions(-) create mode 100644 data/sql/updates/pending_db_world/rev_1771866173424640746.sql diff --git a/data/sql/updates/pending_db_world/rev_1771866173424640746.sql b/data/sql/updates/pending_db_world/rev_1771866173424640746.sql new file mode 100644 index 000000000..6a6809be8 --- /dev/null +++ b/data/sql/updates/pending_db_world/rev_1771866173424640746.sql @@ -0,0 +1 @@ +DELETE FROM `spell_script_names` WHERE `ScriptName` IN ('spell_warl_seed_of_corruption_aura', 'spell_warl_seed_of_corruption_generic_aura'); diff --git a/src/server/scripts/Spells/spell_warlock.cpp b/src/server/scripts/Spells/spell_warlock.cpp index f424f242f..95c2929a3 100644 --- a/src/server/scripts/Spells/spell_warlock.cpp +++ b/src/server/scripts/Spells/spell_warlock.cpp @@ -63,12 +63,8 @@ enum WarlockSpells SPELL_WARLOCK_IMPROVED_HEALTH_FUNNEL_BUFF_R2 = 60956, SPELL_WARLOCK_LIFE_TAP_ENERGIZE = 31818, SPELL_WARLOCK_LIFE_TAP_ENERGIZE_2 = 32553, - SPELL_WARLOCK_SEED_OF_CORRUPTION_R1 = 27243, SPELL_WARLOCK_SEED_OF_CORRUPTION_DAMAGE_R1 = 27285, - SPELL_WARLOCK_SEED_OF_CORRUPTION_DAMAGE_R2 = 47833, - SPELL_WARLOCK_SEED_OF_CORRUPTION_DAMAGE_R3 = 47834, SPELL_WARLOCK_SEED_OF_CORRUPTION_DAMAGE_GENERIC = 32865, - SPELL_WARLOCK_SEED_OF_CORRUPTION_VISUAL = 37826, SPELL_WARLOCK_SOULSHATTER = 32835, SPELL_WARLOCK_SIPHON_LIFE_HEAL = 63106, SPELL_WARLOCK_UNSTABLE_AFFLICTION_DISPEL = 31117, @@ -742,123 +738,6 @@ class spell_warl_seed_of_corruption_damage : public SpellScript } }; -// -27243 - Seed of Corruption -class spell_warl_seed_of_corruption_aura: public AuraScript -{ - PrepareAuraScript(spell_warl_seed_of_corruption_aura); - - bool Validate(SpellInfo const* /*spellInfo*/) override - { - return ValidateSpellInfo({ - SPELL_WARLOCK_SEED_OF_CORRUPTION_DAMAGE_R1, - SPELL_WARLOCK_SEED_OF_CORRUPTION_DAMAGE_R2, - SPELL_WARLOCK_SEED_OF_CORRUPTION_DAMAGE_R3, - SPELL_WARLOCK_SEED_OF_CORRUPTION_VISUAL - }); - } - - void CalculateAmount(AuraEffect const* aurEff, int32& amount, bool& /*canBeRecalculated*/) - { - if (!GetCaster()) - return; - - // effect 1 scales with 14% of caster's SP (DBC data) - amount = GetCaster()->SpellDamageBonusDone(GetUnitOwner(), GetSpellInfo(), amount, DOT, aurEff->GetEffIndex(), aurEff->GetPctMods()); - } - - void Detonate(AuraEffect const* aurEff) - { - if (!GetCaster() || !GetTarget()) - return; - - GetTarget()->CastSpell(GetTarget(), SPELL_WARLOCK_SEED_OF_CORRUPTION_VISUAL, true, nullptr, aurEff); - GetCaster()->CastSpell(GetTarget(), sSpellMgr->GetSpellWithRank(SPELL_WARLOCK_SEED_OF_CORRUPTION_DAMAGE_R1, GetSpellInfo()->GetRank()), true, nullptr, aurEff); - } - - void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) - { - PreventDefaultAction(); - DamageInfo* damageInfo = eventInfo.GetDamageInfo(); - if (!damageInfo || !damageInfo->GetDamage()) - return; - - int32 remainingDamage = aurEff->GetAmount() - damageInfo->GetDamage(); - if (remainingDamage > 0) - { - GetAura()->GetEffect(EFFECT_1)->SetAmount(remainingDamage); - } - else // damage threshold has been reached - { - Remove(AURA_REMOVE_BY_DEFAULT); - Detonate(aurEff); - } - } - - void OnRemove(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/) - { - AuraRemoveMode removeMode = GetTargetApplication()->GetRemoveMode(); - if (removeMode == AURA_REMOVE_BY_DEATH) - Detonate(aurEff); - } - - void Register() override - { - DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_warl_seed_of_corruption_aura::CalculateAmount, EFFECT_1, SPELL_AURA_DUMMY); - AfterEffectRemove += AuraEffectRemoveFn(spell_warl_seed_of_corruption_aura::OnRemove, EFFECT_0, SPELL_AURA_PERIODIC_DAMAGE, AURA_EFFECT_HANDLE_REAL); - OnEffectProc += AuraEffectProcFn(spell_warl_seed_of_corruption_aura::HandleProc, EFFECT_1, SPELL_AURA_DUMMY); - } -}; - -// Monster spells, triggered only on detonation threshold reached (not on death) -// 32863 - Seed of Corruption -// 36123 - Seed of Corruption -// 38252 - Seed of Corruption -// 39367 - Seed of Corruption -// 44141 - Seed of Corruption -// 70388 - Seed of Corruption -class spell_warl_seed_of_corruption_generic_aura: public AuraScript -{ - PrepareAuraScript(spell_warl_seed_of_corruption_generic_aura); - - bool Validate(SpellInfo const* /*spellInfo*/) override - { - return ValidateSpellInfo({ SPELL_WARLOCK_SEED_OF_CORRUPTION_DAMAGE_GENERIC, SPELL_WARLOCK_SEED_OF_CORRUPTION_VISUAL }); - } - - void Detonate(AuraEffect const* aurEff) - { - if (!GetCaster() || !GetTarget()) - return; - - GetTarget()->CastSpell(GetTarget(), SPELL_WARLOCK_SEED_OF_CORRUPTION_VISUAL, true, nullptr, aurEff); - GetCaster()->CastCustomSpell(SPELL_WARLOCK_SEED_OF_CORRUPTION_DAMAGE_GENERIC, SPELLVALUE_BASE_POINT0, GetSpellInfo()->GetEffect(EFFECT_1).CalcValue(), GetTarget(), true, nullptr, aurEff); - } - - void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) - { - PreventDefaultAction(); - DamageInfo* damageInfo = eventInfo.GetDamageInfo(); - if (!damageInfo || !damageInfo->GetDamage()) - return; - - int32 remainingDamage = aurEff->GetAmount() - damageInfo->GetDamage(); - if (remainingDamage > 0) - { - GetAura()->GetEffect(EFFECT_1)->SetAmount(remainingDamage); - } - else // damage threshold has been reached - { - Remove(AURA_REMOVE_BY_DEFAULT); - Detonate(aurEff); - } - } - - void Register() override - { - OnEffectProc += AuraEffectProcFn(spell_warl_seed_of_corruption_generic_aura::HandleProc, EFFECT_1, SPELL_AURA_DUMMY); - } -}; - // 29858 - Soulshatter class spell_warl_soulshatter : public SpellScript { @@ -1975,8 +1854,6 @@ void AddSC_warlock_spell_scripts() RegisterSpellScript(spell_warl_life_tap); RegisterSpellScript(spell_warl_ritual_of_doom_effect); RegisterSpellScript(spell_warl_seed_of_corruption_damage); - RegisterSpellScript(spell_warl_seed_of_corruption_aura); - RegisterSpellScript(spell_warl_seed_of_corruption_generic_aura); RegisterSpellScript(spell_warl_shadow_ward); RegisterSpellScript(spell_warl_siphon_life); RegisterSpellScript(spell_warl_soulshatter); From d39a03b7ab7b51a0e85efa4cb0c5364054fba96e Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Mon, 23 Feb 2026 18:38:49 +0000 Subject: [PATCH 057/150] chore(DB): import pending files Referenced commit(s): 4277ac0b262b229bf798339c77b1254aedfabf1b --- .../rev_1771855011429365338.sql => db_world/2026_02_23_06.sql} | 1 + .../rev_1771866173424640746.sql => db_world/2026_02_23_07.sql} | 1 + 2 files changed, 2 insertions(+) rename data/sql/updates/{pending_db_world/rev_1771855011429365338.sql => db_world/2026_02_23_06.sql} (92%) rename data/sql/updates/{pending_db_world/rev_1771866173424640746.sql => db_world/2026_02_23_07.sql} (76%) diff --git a/data/sql/updates/pending_db_world/rev_1771855011429365338.sql b/data/sql/updates/db_world/2026_02_23_06.sql similarity index 92% rename from data/sql/updates/pending_db_world/rev_1771855011429365338.sql rename to data/sql/updates/db_world/2026_02_23_06.sql index 4d22aeed6..01167c6ed 100644 --- a/data/sql/updates/pending_db_world/rev_1771855011429365338.sql +++ b/data/sql/updates/db_world/2026_02_23_06.sql @@ -1,3 +1,4 @@ +-- DB update 2026_02_23_05 -> 2026_02_23_06 -- Fix spell_script_names for spell_hun_rapid_recuperation -- Script was moved from talent (53228/53232) to periodic mana aura (56654/58882) DELETE FROM `spell_script_names` WHERE `ScriptName` = 'spell_hun_rapid_recuperation'; diff --git a/data/sql/updates/pending_db_world/rev_1771866173424640746.sql b/data/sql/updates/db_world/2026_02_23_07.sql similarity index 76% rename from data/sql/updates/pending_db_world/rev_1771866173424640746.sql rename to data/sql/updates/db_world/2026_02_23_07.sql index 6a6809be8..1314e88cb 100644 --- a/data/sql/updates/pending_db_world/rev_1771866173424640746.sql +++ b/data/sql/updates/db_world/2026_02_23_07.sql @@ -1 +1,2 @@ +-- DB update 2026_02_23_06 -> 2026_02_23_07 DELETE FROM `spell_script_names` WHERE `ScriptName` IN ('spell_warl_seed_of_corruption_aura', 'spell_warl_seed_of_corruption_generic_aura'); From e3f6693d1a7669c0182c96eaf77fb6234936e092 Mon Sep 17 00:00:00 2001 From: Jasper <97269008+jads147@users.noreply.github.com> Date: Mon, 23 Feb 2026 20:25:49 +0100 Subject: [PATCH 058/150] fix(Core/DynamicObject): Fix Death and Decay not ticking while stationary (#24205) Co-authored-by: blinkysc <37940565+blinkysc@users.noreply.github.com> --- src/server/game/Entities/DynamicObject/DynamicObject.cpp | 8 ++++++++ src/server/game/Entities/DynamicObject/DynamicObject.h | 2 ++ 2 files changed, 10 insertions(+) diff --git a/src/server/game/Entities/DynamicObject/DynamicObject.cpp b/src/server/game/Entities/DynamicObject/DynamicObject.cpp index 5a6465404..173969381 100644 --- a/src/server/game/Entities/DynamicObject/DynamicObject.cpp +++ b/src/server/game/Entities/DynamicObject/DynamicObject.cpp @@ -272,3 +272,11 @@ void DynamicObject::UnbindFromCaster() _caster->_UnregisterDynObject(this); _caster = nullptr; } + +bool DynamicObject::IsUpdateNeeded() +{ + if (GetByteValue(DYNAMICOBJECT_BYTES, 0) == DYNAMIC_OBJECT_AREA_SPELL) + return true; + + return WorldObject::IsUpdateNeeded(); +} diff --git a/src/server/game/Entities/DynamicObject/DynamicObject.h b/src/server/game/Entities/DynamicObject/DynamicObject.h index b5ff4b1c7..ae87d8108 100644 --- a/src/server/game/Entities/DynamicObject/DynamicObject.h +++ b/src/server/game/Entities/DynamicObject/DynamicObject.h @@ -62,6 +62,8 @@ public: ObjectGuid const& GetOldFarsightGUID() const { return _oldFarsightGUID; } + bool IsUpdateNeeded() override; + protected: Aura* _aura; Aura* _removedAura; From 3001b11d9a76a2ffba9112ed70c74d06c8fc5922 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stefano=20Borz=C3=AC?= Date: Mon, 23 Feb 2026 20:40:33 +0100 Subject: [PATCH 059/150] chore(Core/Battleground): expose damange,healing and kills attribute for modules (#24801) --- src/server/game/Battlegrounds/BattlegroundScore.h | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/server/game/Battlegrounds/BattlegroundScore.h b/src/server/game/Battlegrounds/BattlegroundScore.h index 80ce87fe0..de0663cdc 100644 --- a/src/server/game/Battlegrounds/BattlegroundScore.h +++ b/src/server/game/Battlegrounds/BattlegroundScore.h @@ -59,7 +59,12 @@ struct AC_GAME_API BattlegroundScore friend class Arena; friend class Battleground; -protected: + public: + [[nodiscard]] uint32 GetKillingBlows() const { return KillingBlows; } + [[nodiscard]] uint32 GetDamageDone() const { return DamageDone; } + [[nodiscard]] uint32 GetHealingDone() const { return HealingDone; } + + protected: BattlegroundScore(ObjectGuid playerGuid) : PlayerGuid(playerGuid) { } virtual ~BattlegroundScore() = default; @@ -97,12 +102,9 @@ protected: // For Logging purpose virtual std::string ToString() const { return ""; } - [[nodiscard]] uint32 GetKillingBlows() const { return KillingBlows; } [[nodiscard]] uint32 GetDeaths() const { return Deaths; } [[nodiscard]] uint32 GetHonorableKills() const { return HonorableKills; } [[nodiscard]] uint32 GetBonusHonor() const { return BonusHonor; } - [[nodiscard]] uint32 GetDamageDone() const { return DamageDone; } - [[nodiscard]] uint32 GetHealingDone() const { return HealingDone; } [[nodiscard]] virtual uint32 GetAttr1() const { return 0; } [[nodiscard]] virtual uint32 GetAttr2() const { return 0; } From b041bd54e158941e010db5b7f834f304f187b9f4 Mon Sep 17 00:00:00 2001 From: sudlud Date: Tue, 24 Feb 2026 01:46:34 +0100 Subject: [PATCH 060/150] fix(DB/Gameobject): Sniffed Values for 'Mixed Fruit Bowl' spawns (#24832) --- .../rev_1771880222045839200.sql | 35 +++++++++++++++++++ 1 file changed, 35 insertions(+) create mode 100644 data/sql/updates/pending_db_world/rev_1771880222045839200.sql diff --git a/data/sql/updates/pending_db_world/rev_1771880222045839200.sql b/data/sql/updates/pending_db_world/rev_1771880222045839200.sql new file mode 100644 index 000000000..e10d16bf2 --- /dev/null +++ b/data/sql/updates/pending_db_world/rev_1771880222045839200.sql @@ -0,0 +1,35 @@ +-- Update gameobject 'Mixed Fruit Bowl' with sniffed values +-- updated spawns +DELETE FROM `gameobject` WHERE (`id` IN (195067)) AND (`guid` IN (240026, 240040, 240052, 240053, 240054, 240055, 240056, 240059, 240061, 240062, 240220, 240221, 240222, 240223, 240224, 240225, 240226, 240227, 240228, 240229, 240230)); +INSERT INTO `gameobject` (`guid`, `id`, `map`, `zoneId`, `areaId`, `spawnMask`, `phaseMask`, `position_x`, `position_y`, `position_z`, `orientation`, `rotation0`, `rotation1`, `rotation2`, `rotation3`, `spawntimesecs`, `animprogress`, `state`, `ScriptName`, `VerifiedBuild`, `Comment`) VALUES +(240026, 195067, 571, 0, 0, 1, 1, 5854.46533203125, 767.34027099609375, 641.37200927734375, 0, 0, 0, 0, 1, 120, 255, 1, "", 46248, NULL), +(240040, 195067, 530, 0, 0, 1, 1, 9419.5224609375, -6850.59716796875, 15.02394580841064453, 0, 0, 0, 0, 1, 120, 255, 1, "", 51943, NULL), +(240052, 195067, 530, 0, 0, 1, 1, -4314.91162109375, -12442.8330078125, 17.23089027404785156, 0, 0, 0, 0, 1, 120, 255, 1, "", 51943, NULL), +(240053, 195067, 530, 0, 0, 1, 1, -4313.84716796875, -12446.4931640625, 17.29690933227539062, 0, 0, 0, 0, 1, 120, 255, 1, "", 51943, NULL), +(240054, 195067, 530, 0, 0, 1, 1, -4324.51025390625, -12450.021484375, 16.69842720031738281, 0, 0, 0, 0, 1, 120, 255, 1, "", 51943, NULL), +(240055, 195067, 530, 0, 0, 1, 1, -4324.767578125, -12454.0107421875, 16.80428314208984375, 0, 0, 0, 0, 1, 120, 255, 1, "", 51943, NULL), +(240056, 195067, 530, 0, 0, 1, 1, -4309.53125, -12421.048828125, 17.52263069152832031, 0, 0, 0, 0, 1, 120, 255, 1, "", 51943, NULL), +(240059, 195067, 530, 0, 0, 1, 1, -1782.921875, 4936.822265625, -22.6595134735107421, 0, 0, 0, 0, 1, 120, 255, 1, "", 51943, NULL), +(240061, 195067, 530, 0, 0, 1, 1, -1829.6197509765625, 4920.39697265625, -21.5714244842529296, 0, 0, 0, 0, 1, 120, 255, 1, "", 51943, NULL), +(240062, 195067, 530, 0, 0, 1, 1, -1814.9097900390625, 4911.5078125, -21.3174991607666015, 0, 0, 0, 0, 1, 120, 255, 1, "", 51943, NULL), +(240220, 195067, 0, 0, 0, 1, 1, 1778.8472900390625, 260.072906494140625, 59.49801254272460937, 0, 0, 0, 0, 1, 120, 255, 1, "", 51943, NULL), +(240221, 195067, 1, 0, 0, 1, 1, 10054.146484375, 2124.819580078125, 1329.703125, 0, 0, 0, 0, 1, 120, 255, 1, "", 51943, NULL), +(240222, 195067, 1, 0, 0, 1, 1, 10047.404296875, 2110.173583984375, 1329.648193359375, 0, 0, 0, 0, 1, 120, 255, 1, "", 51943, NULL), +(240223, 195067, 1, 0, 0, 1, 1, 10059.8408203125, 2122.515625, 1329.6710205078125, 0, 0, 0, 0, 1, 120, 255, 1, "", 51943, NULL), +(240224, 195067, 0, 0, 0, 1, 1, -5161.68603515625, -869.670166015625, 507.202484130859375, 0, 0, 0, 0, 1, 120, 255, 1, "", 51943, NULL), +(240225, 195067, 0, 0, 0, 1, 1, -9352.4326171875, 172.9270782470703125, 61.57478713989257812, 0, 0, 0, 0, 1, 120, 255, 1, "", 51943, NULL), +(240226, 195067, 1, 0, 0, 1, 1, 1175.46533203125, -4455.31591796875, 21.52185630798339843, 0, 0, 0, 0, 1, 120, 255, 1, "", 51943, NULL), +(240227, 195067, 1, 0, 0, 1, 1, 1185.3629150390625, -4460.861328125, 21.10199546813964843, 0, 0, 0, 0, 1, 120, 255, 1, "", 51943, NULL), +(240228, 195067, 1, 0, 0, 1, 1, 1179.267333984375, -4468.45166015625, 21.2471466064453125, 0, 0, 0, 0, 1, 120, 255, 1, "", 51943, NULL), +(240229, 195067, 1, 0, 0, 1, 1, -983.56597900390625, -73.3246536254882812, 20.64240455627441406, 0, 0, 0, 0, 1, 120, 255, 1, "", 46368, NULL), +(240230, 195067, 1, 0, 0, 1, 1, -980.89239501953125, -79.265625, 20.10221290588378906, 0, 0, 0, 0, 1, 120, 255, 1, "", 46368, NULL); + +-- remove invalid spawns +-- these do not show in sniffs (most likely hand placed spawns) +DELETE FROM `gameobject` WHERE (`id` IN (195067)) AND (`guid` IN (240067, 240063, 240066, 240064, 240065, 240030, 240034, 240031, 240032, 240033, 240036, 240037, 240038, 240035, 240048, 240046, 240047, 240049, 240042, 240045, 240043, 240044, 240015, 240014, 240016, 240058, 240057, 240060, 240050, 240051, 240041, 240039, 240027, 240028, 240029, 240025)); +DELETE FROM `gameobject_addon` WHERE (`guid` IN (240067, 240063, 240066, 240064, 240065, 240030, 240034, 240031, 240032, 240033, 240036, 240037, 240038, 240035, 240048, 240046, 240047, 240049, 240042, 240045, 240043, 240044, 240015, 240014, 240016, 240058, 240057, 240060, 240050, 240051, 240041, 240039, 240027, 240028, 240029, 240025)); +DELETE FROM `game_event_gameobject` WHERE (`eventEntry` = 51) AND (`guid` IN (240067, 240063, 240066, 240064, 240065, 240030, 240034, 240031, 240032, 240033, 240036, 240037, 240038, 240035, 240048, 240046, 240047, 240049, 240042, 240045, 240043, 240044, 240015, 240014, 240016, 240058, 240057, 240060, 240050, 240051, 240041, 240039, 240027, 240028, 240029, 240025)); + +-- enable all spawns for eventEntry 51 +DELETE FROM `game_event_gameobject` WHERE (`eventEntry` = 51) AND (`guid` IN (SELECT `guid` FROM `gameobject` WHERE `id` IN (195067))); +INSERT INTO `game_event_gameobject` (SELECT 51, `guid` FROM `gameobject` WHERE `id` IN (195067)); From e8ce0330879adf9f68a23f99ac89a13de4a4f80d Mon Sep 17 00:00:00 2001 From: blinkysc <37940565+blinkysc@users.noreply.github.com> Date: Mon, 23 Feb 2026 18:46:50 -0600 Subject: [PATCH 061/150] fix(Core/Spells): Prevent stealth from breaking on friendly proc spells (#24834) Co-authored-by: blinkysc Co-authored-by: ariel- --- src/server/game/Spells/Auras/SpellAuras.cpp | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/server/game/Spells/Auras/SpellAuras.cpp b/src/server/game/Spells/Auras/SpellAuras.cpp index a6fa20e6c..d313b5ca1 100644 --- a/src/server/game/Spells/Auras/SpellAuras.cpp +++ b/src/server/game/Spells/Auras/SpellAuras.cpp @@ -2177,6 +2177,14 @@ uint8 Aura::GetProcEffectMask(AuraApplication* aurApp, ProcEventInfo& eventInfo, return 0; } + // Don't consume stealth charges from friendly spells + if (m_spellInfo->HasAura(SPELL_AURA_MOD_STEALTH)) + { + if (SpellInfo const* spellInfo = eventInfo.GetSpellInfo()) + if (spellInfo->IsPositive()) + return 0; + } + // check if we have charges to proc with if (IsUsingCharges() && !GetCharges()) return 0; From 0fb5b2dfe374d8c25f664be4db9b60dc68e61cb7 Mon Sep 17 00:00:00 2001 From: blinkysc <37940565+blinkysc@users.noreply.github.com> Date: Mon, 23 Feb 2026 18:47:03 -0600 Subject: [PATCH 062/150] fix(Core/Spells): Fix Beacon of Light healing attribution (#24836) Co-authored-by: blinkysc --- src/server/scripts/Spells/spell_paladin.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/server/scripts/Spells/spell_paladin.cpp b/src/server/scripts/Spells/spell_paladin.cpp index 0e5f3b48a..8b9dc5c44 100644 --- a/src/server/scripts/Spells/spell_paladin.cpp +++ b/src/server/scripts/Spells/spell_paladin.cpp @@ -2157,7 +2157,7 @@ class spell_pal_light_s_beacon : public AuraScript if (!beaconTarget || !beaconTarget->HasAura(SPELL_PALADIN_BEACON_OF_LIGHT_AURA, eventInfo.GetActor()->GetGUID())) return; - eventInfo.GetActor()->CastCustomSpell(healSpellId, SPELLVALUE_BASE_POINT0, heal, beaconTarget, true, nullptr, aurEff); + eventInfo.GetActor()->CastCustomSpell(healSpellId, SPELLVALUE_BASE_POINT0, heal, beaconTarget, true, nullptr, aurEff, eventInfo.GetActor()->GetGUID()); } void Register() override From e9360f56c4c791cae4caf0df7d2d0a1052dc98a9 Mon Sep 17 00:00:00 2001 From: Benjamin Jackson <38561765+heyitsbench@users.noreply.github.com> Date: Mon, 23 Feb 2026 19:47:23 -0500 Subject: [PATCH 063/150] fix(Core/AuthSession): Send proper account flags for authentication responses. (#24829) --- .../apps/authserver/Server/AuthSession.cpp | 31 ++++++++++--------- .../apps/authserver/Server/AuthSession.h | 1 + .../Database/Implementation/LoginDatabase.cpp | 4 +-- 3 files changed, 19 insertions(+), 17 deletions(-) diff --git a/src/server/apps/authserver/Server/AuthSession.cpp b/src/server/apps/authserver/Server/AuthSession.cpp index e5315c9ec..ce4a1e590 100644 --- a/src/server/apps/authserver/Server/AuthSession.cpp +++ b/src/server/apps/authserver/Server/AuthSession.cpp @@ -136,13 +136,13 @@ std::unordered_map const Handlers = AuthSession::InitHandler void AccountInfo::LoadResult(Field* fields) { - // 0 1 2 3 4 5 - // SELECT a.id, a.username, a.locked, a.lock_country, a.last_ip, a.failed_logins, - // 6 7 + // 0 1 2 3 4 5 6 + // SELECT a.id, a.username, a.locked, a.lock_country, a.last_ip, a.Flags, a.failed_logins, + // 7 8 // ab.unbandate > UNIX_TIMESTAMP() OR ab.unbandate = ab.bandate, ab.unbandate = ab.bandate, - // 8 9 + // 9 10 // ipb.unbandate > UNIX_TIMESTAMP() OR ipb.unbandate = ipb.bandate, ipb.unbandate = ipb.bandate, - // 10 + // 11 // aa.gmlevel (, more query-specific fields) // FROM account a LEFT JOIN account_access aa ON a.id = aa.id LEFT JOIN account_banned ab ON ab.id = a.id AND ab.active = 1 LEFT JOIN ip_banned ipb ON ipb.ip = ? WHERE a.username = ? @@ -151,10 +151,11 @@ void AccountInfo::LoadResult(Field* fields) IsLockedToIP = fields[2].Get(); LockCountry = fields[3].Get(); LastIP = fields[4].Get(); - FailedLogins = fields[5].Get(); - IsBanned = fields[6].Get() || fields[8].Get(); - IsPermanentlyBanned = fields[7].Get() || fields[9].Get(); - SecurityLevel = static_cast(fields[10].Get()) > SEC_CONSOLE ? SEC_CONSOLE : static_cast(fields[10].Get()); + Flags = fields[5].Get(); + FailedLogins = fields[6].Get(); + IsBanned = fields[7].Get() || fields[9].Get(); + IsPermanentlyBanned = fields[8].Get() || fields[10].Get(); + SecurityLevel = static_cast(fields[11].Get()) > SEC_CONSOLE ? SEC_CONSOLE : static_cast(fields[12].Get()); // Use our own uppercasing of the account name instead of using UPPER() in mysql query // This is how the account was created in the first place and changing it now would result in breaking @@ -387,10 +388,10 @@ void AuthSession::LogonChallengeCallback(PreparedQueryResult result) uint8 securityFlags = 0; // Check if a TOTP token is needed - if (!fields[11].IsNull()) + if (!fields[12].IsNull()) { securityFlags = 4; - _totpSecret = fields[11].Get(); + _totpSecret = fields[12].Get(); if (auto const& secret = sSecretMgr->GetSecret(SECRET_TOTP_MASTER_KEY)) { @@ -406,8 +407,8 @@ void AuthSession::LogonChallengeCallback(PreparedQueryResult result) } _srp6.emplace(_accountInfo.Login, - fields[12].Get(), - fields[13].Get()); + fields[13].Get(), + fields[14].Get()); // Fill the response packet with the result if (AuthHelper::IsAcceptedClientBuild(_build)) @@ -531,7 +532,7 @@ bool AuthSession::HandleLogonProof() proof.M2 = M2; proof.cmd = AUTH_LOGON_PROOF; proof.error = 0; - proof.AccountFlags = ACCOUNT_FLAG_PROPASS_LOCK; // enum AccountFlag + proof.AccountFlags = _accountInfo.Flags; proof.SurveyId = 0; proof.LoginFlags = 0; // 0x1 = has account message @@ -667,7 +668,7 @@ void AuthSession::ReconnectChallengeCallback(PreparedQueryResult result) Field* fields = result->Fetch(); _accountInfo.LoadResult(fields); - _sessionKey = fields[11].Get(); + _sessionKey = fields[12].Get(); Acore::Crypto::GetRandomBytes(_reconnectProof); _status = STATUS_RECONNECT_PROOF; diff --git a/src/server/apps/authserver/Server/AuthSession.h b/src/server/apps/authserver/Server/AuthSession.h index 0c61e5e2f..0ea2fafff 100644 --- a/src/server/apps/authserver/Server/AuthSession.h +++ b/src/server/apps/authserver/Server/AuthSession.h @@ -54,6 +54,7 @@ struct AccountInfo bool IsLockedToIP = false; std::string LockCountry; std::string LastIP; + uint32 Flags; uint32 FailedLogins = 0; bool IsBanned = false; bool IsPermanentlyBanned = false; diff --git a/src/server/database/Database/Implementation/LoginDatabase.cpp b/src/server/database/Database/Implementation/LoginDatabase.cpp index 1e091b56e..298ae09d5 100644 --- a/src/server/database/Database/Implementation/LoginDatabase.cpp +++ b/src/server/database/Database/Implementation/LoginDatabase.cpp @@ -24,7 +24,7 @@ void LoginDatabaseConnection::DoPrepareStatements() m_stmts.resize(MAX_LOGINDATABASE_STATEMENTS); PrepareStatement(LOGIN_SEL_LOGONCHALLENGE, - "SELECT a.id, a.username, a.locked, a.lock_country, a.last_ip, a.failed_logins, " + "SELECT a.id, a.username, a.locked, a.lock_country, a.last_ip, a.Flags, a.failed_logins, " "ab.unbandate > UNIX_TIMESTAMP() OR ab.unbandate = ab.bandate, ab.unbandate = ab.bandate, " "ipb.unbandate > UNIX_TIMESTAMP() OR ipb.unbandate = ipb.bandate, ipb.unbandate = ipb.bandate, " "aa.gmlevel, a.totp_secret, a.salt, a.verifier " @@ -34,7 +34,7 @@ void LoginDatabaseConnection::DoPrepareStatements() "LEFT JOIN ip_banned ipb ON ipb.ip = ? " "WHERE a.username = ?", CONNECTION_ASYNC); PrepareStatement(LOGIN_SEL_RECONNECTCHALLENGE, - "SELECT a.id, a.username, a.locked, a.lock_country, a.last_ip, a.failed_logins, " + "SELECT a.id, a.username, a.locked, a.lock_country, a.last_ip, a.Flags, a.failed_logins, " "ab.unbandate > UNIX_TIMESTAMP() OR ab.unbandate = ab.bandate, ab.unbandate = ab.bandate, " "ipb.unbandate > UNIX_TIMESTAMP() OR ipb.unbandate = ipb.bandate, ipb.unbandate = ipb.bandate, " "aa.gmlevel, a.session_key " From af7e91f9a982941579d532908101d3e239dac9e3 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Tue, 24 Feb 2026 00:47:38 +0000 Subject: [PATCH 064/150] chore(DB): import pending files Referenced commit(s): b041bd54e158941e010db5b7f834f304f187b9f4 --- .../rev_1771880222045839200.sql => db_world/2026_02_24_00.sql} | 1 + 1 file changed, 1 insertion(+) rename data/sql/updates/{pending_db_world/rev_1771880222045839200.sql => db_world/2026_02_24_00.sql} (99%) diff --git a/data/sql/updates/pending_db_world/rev_1771880222045839200.sql b/data/sql/updates/db_world/2026_02_24_00.sql similarity index 99% rename from data/sql/updates/pending_db_world/rev_1771880222045839200.sql rename to data/sql/updates/db_world/2026_02_24_00.sql index e10d16bf2..977118e2c 100644 --- a/data/sql/updates/pending_db_world/rev_1771880222045839200.sql +++ b/data/sql/updates/db_world/2026_02_24_00.sql @@ -1,3 +1,4 @@ +-- DB update 2026_02_23_07 -> 2026_02_24_00 -- Update gameobject 'Mixed Fruit Bowl' with sniffed values -- updated spawns DELETE FROM `gameobject` WHERE (`id` IN (195067)) AND (`guid` IN (240026, 240040, 240052, 240053, 240054, 240055, 240056, 240059, 240061, 240062, 240220, 240221, 240222, 240223, 240224, 240225, 240226, 240227, 240228, 240229, 240230)); From 8b9cdfde1302be9493c737a0d27a829283909a68 Mon Sep 17 00:00:00 2001 From: sogladev Date: Tue, 24 Feb 2026 01:47:49 +0100 Subject: [PATCH 065/150] fix(DB/QuestTracker): add index (#24803) Co-authored-by: Shauren --- .../updates/pending_db_characters/rev_1771762913747659496.sql | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 data/sql/updates/pending_db_characters/rev_1771762913747659496.sql diff --git a/data/sql/updates/pending_db_characters/rev_1771762913747659496.sql b/data/sql/updates/pending_db_characters/rev_1771762913747659496.sql new file mode 100644 index 000000000..fd65b3f01 --- /dev/null +++ b/data/sql/updates/pending_db_characters/rev_1771762913747659496.sql @@ -0,0 +1,4 @@ +-- +ALTER TABLE `quest_tracker` + MODIFY COLUMN `id` int UNSIGNED NOT NULL DEFAULT 0 FIRST, + ADD UNIQUE INDEX `idx_latest_quest_for_character`(`id`, `character_guid`, `quest_accept_time` DESC); From 34f1d2b39a8a127c06888b7286f24aef64d60d3d Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Tue, 24 Feb 2026 00:47:57 +0000 Subject: [PATCH 066/150] chore(DB): import pending files Referenced commit(s): e8ce0330879adf9f68a23f99ac89a13de4a4f80d --- .../2026_02_24_00.sql} | 1 + 1 file changed, 1 insertion(+) rename data/sql/updates/{pending_db_characters/rev_1771762913747659496.sql => db_characters/2026_02_24_00.sql} (81%) diff --git a/data/sql/updates/pending_db_characters/rev_1771762913747659496.sql b/data/sql/updates/db_characters/2026_02_24_00.sql similarity index 81% rename from data/sql/updates/pending_db_characters/rev_1771762913747659496.sql rename to data/sql/updates/db_characters/2026_02_24_00.sql index fd65b3f01..7ea5edb57 100644 --- a/data/sql/updates/pending_db_characters/rev_1771762913747659496.sql +++ b/data/sql/updates/db_characters/2026_02_24_00.sql @@ -1,3 +1,4 @@ +-- DB update 2025_09_03_00 -> 2026_02_24_00 -- ALTER TABLE `quest_tracker` MODIFY COLUMN `id` int UNSIGNED NOT NULL DEFAULT 0 FIRST, From 782d4d539d191238583bbfa3ebcf37590f486513 Mon Sep 17 00:00:00 2001 From: sudlud Date: Tue, 24 Feb 2026 01:48:22 +0100 Subject: [PATCH 067/150] fix(DB/Creature): Sniffed Values for 'Catrina' spawns (#24840) --- .../rev_1771884996282642200.sql | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100644 data/sql/updates/pending_db_world/rev_1771884996282642200.sql diff --git a/data/sql/updates/pending_db_world/rev_1771884996282642200.sql b/data/sql/updates/pending_db_world/rev_1771884996282642200.sql new file mode 100644 index 000000000..5388909fb --- /dev/null +++ b/data/sql/updates/pending_db_world/rev_1771884996282642200.sql @@ -0,0 +1,18 @@ +-- Update creature 'Catrina' with sniffed values +-- updated spawns +DELETE FROM `creature` WHERE (`id1` IN (34383)) AND (`guid` IN (240226, 240227, 240259, 240260, 240261, 240262, 240263, 240264, 240265, 240266)); +INSERT INTO `creature` (`guid`, `id1`, `map`, `spawnMask`, `phaseMask`, `equipment_id`, `position_x`, `position_y`, `position_z`, `orientation`, `spawntimesecs`, `wander_distance`, `MovementType`, `npcflag`, `unit_flags`, `dynamicflags`, `ScriptName`, `VerifiedBuild`, `CreateObject`, `Comment`) VALUES +(240226, 34383, 1, 1, 1, 1, 1181.736083984375, -4463.10791015625, 21.34230422973632812, 1.221730470657348632, 120, 0, 0, 0, 0, 0, "", 51943, 1, NULL), +(240227, 34383, 0, 1, 1, 1, -9329.3876953125, 178.1302032470703125, 61.78533172607421875, 3.909537553787231445, 120, 0, 0, 0, 0, 0, "", 51943, 1, NULL), +(240259, 34383, 571, 1, 1, 1, 5852.19775390625, 763.51214599609375, 641.49072265625, 3.909537553787231445, 120, 0, 0, 0, 0, 0, "", 46248, 1, NULL), +(240260, 34383, 0, 1, 1, 1, 1803.7447509765625, 219.59722900390625, 60.44121551513671875, 1.361356854438781738, 120, 0, 0, 0, 0, 0, "", 51943, 1, NULL), +(240261, 34383, 530, 1, 1, 1, 9409.2080078125, -6841.0087890625, 16.17881965637207031, 2.513274192810058593, 120, 0, 0, 0, 0, 0, "", 51943, 1, NULL), +(240262, 34383, 1, 1, 1, 1, 10048.3330078125, 2122.397705078125, 1330.0263671875, 3.141592741012573242, 120, 0, 0, 0, 0, 0, "", 51943, 1, NULL), +(240263, 34383, 1, 1, 1, 1, -977.62677001953125, -74.53125, 19.17006301879882812, 0.244346097111701965, 120, 0, 0, 0, 0, 0, "", 51943, 1, NULL), +(240264, 34383, 530, 1, 1, 1, -4314.36474609375, -12451.16015625, 17.92534828186035156, 5.724679946899414062, 120, 0, 0, 0, 0, 0, "", 51943, 1, NULL), +(240265, 34383, 530, 1, 1, 1, -1792.2708740234375, 4921.30810546875, -21.5448799133300781, 2.58308720588684082, 120, 0, 0, 0, 0, 0, "", 51943, 1, NULL), +(240266, 34383, 0, 1, 1, 1, -5145.17041015625, -856.00177001953125, 508.79412841796875, 0.907571196556091308, 120, 0, 0, 0, 0, 0, "", 51943, 1, NULL); + +-- enable all spawns for eventEntry 51 +DELETE FROM `game_event_creature` WHERE (`eventEntry` = 51) AND (`guid` IN (SELECT `guid` FROM `creature` WHERE `id1` IN (34383))); +INSERT INTO `game_event_creature` (SELECT 51, `guid` FROM `creature` WHERE `id1` IN (34383)); From badbf52adc06b2e03b5ae904833726c2bc7388a1 Mon Sep 17 00:00:00 2001 From: sudlud Date: Tue, 24 Feb 2026 01:48:39 +0100 Subject: [PATCH 068/150] fix(DB/Creature): Sniffed Values for 'Chapman' spawns (#24839) --- .../rev_1771884370767583400.sql | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100644 data/sql/updates/pending_db_world/rev_1771884370767583400.sql diff --git a/data/sql/updates/pending_db_world/rev_1771884370767583400.sql b/data/sql/updates/pending_db_world/rev_1771884370767583400.sql new file mode 100644 index 000000000..56d14b62d --- /dev/null +++ b/data/sql/updates/pending_db_world/rev_1771884370767583400.sql @@ -0,0 +1,18 @@ +-- Update creature 'Chapman' with sniffed values +-- updated spawns +DELETE FROM `creature` WHERE (`id1` IN (34382)) AND (`guid` IN (240228, 240229, 240251, 240252, 240253, 240254, 240255, 240256, 240257, 240258)); +INSERT INTO `creature` (`guid`, `id1`, `map`, `spawnMask`, `phaseMask`, `equipment_id`, `position_x`, `position_y`, `position_z`, `orientation`, `spawntimesecs`, `wander_distance`, `MovementType`, `npcflag`, `unit_flags`, `dynamicflags`, `ScriptName`, `VerifiedBuild`, `CreateObject`, `Comment`) VALUES +(240228, 34382, 1, 1, 1, 1, 1179.814208984375, -4461.45654296875, 21.46875, 1.326450228691101074, 120, 0, 0, 0, 0, 0, "", 51943, 1, NULL), +(240229, 34382, 0, 1, 1, 1, -9332.0263671875, 179.579864501953125, 61.80413055419921875, 4.468042850494384765, 120, 0, 0, 0, 0, 0, "", 51943, 1, NULL), +(240251, 34382, 571, 1, 1, 1, 5850.04931640625, 766.30731201171875, 640.9990234375, 4.468042850494384765, 120, 0, 0, 0, 0, 0, "", 46248, 1, NULL), +(240252, 34382, 0, 1, 1, 1, 1806.5382080078125, 219.423614501953125, 60.46582794189453125, 1.65806281566619873, 120, 0, 0, 0, 0, 0, "", 51943, 1, NULL), +(240253, 34382, 530, 1, 1, 1, 9409.1982421875, -6837.9130859375, 16.3055572509765625, 3.630284786224365234, 120, 0, 0, 0, 0, 0, "", 51943, 1, NULL), +(240254, 34382, 1, 1, 1, 1, 10047.9189453125, 2119.15625, 1329.9794921875, 3.176499128341674804, 120, 0, 0, 0, 0, 0, "", 51943, 1, NULL), +(240255, 34382, 1, 1, 1, 1, -978.0225830078125, -72.6458358764648437, 19.29324531555175781, 0.401425719261169433, 120, 0, 0, 0, 0, 0, "", 46368, 1, NULL), +(240256, 34382, 530, 1, 1, 1, -4312.234375, -12449.03515625, 17.73958396911621093, 5.654866695404052734, 120, 0, 0, 0, 0, 0, "", 51943, 1, NULL), +(240257, 34382, 530, 1, 1, 1, -1788.236083984375, 4925.75244140625, -21.6491146087646484, 2.460914134979248046, 120, 0, 0, 0, 0, 0, "", 51943, 1, NULL), +(240258, 34382, 0, 1, 1, 1, -5147.53466796875, -853.826416015625, 508.66314697265625, 0.698131680488586425, 120, 0, 0, 0, 0, 0, "", 51943, 1, NULL); + +-- enable all spawns for eventEntry 51 +DELETE FROM `game_event_creature` WHERE (`eventEntry` = 51) AND (`guid` IN (SELECT `guid` FROM `creature` WHERE `id1` IN (34382))); +INSERT INTO `game_event_creature` (SELECT 51, `guid` FROM `creature` WHERE `id1` IN (34382)); From 7e05ed0be9cddf81909dd84654006fa573066013 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Tue, 24 Feb 2026 00:48:47 +0000 Subject: [PATCH 069/150] chore(DB): import pending files Referenced commit(s): e9360f56c4c791cae4caf0df7d2d0a1052dc98a9 --- .../rev_1771884370767583400.sql => db_world/2026_02_24_01.sql} | 1 + .../rev_1771884996282642200.sql => db_world/2026_02_24_02.sql} | 1 + 2 files changed, 2 insertions(+) rename data/sql/updates/{pending_db_world/rev_1771884370767583400.sql => db_world/2026_02_24_01.sql} (98%) rename data/sql/updates/{pending_db_world/rev_1771884996282642200.sql => db_world/2026_02_24_02.sql} (98%) diff --git a/data/sql/updates/pending_db_world/rev_1771884370767583400.sql b/data/sql/updates/db_world/2026_02_24_01.sql similarity index 98% rename from data/sql/updates/pending_db_world/rev_1771884370767583400.sql rename to data/sql/updates/db_world/2026_02_24_01.sql index 56d14b62d..ac3ea3219 100644 --- a/data/sql/updates/pending_db_world/rev_1771884370767583400.sql +++ b/data/sql/updates/db_world/2026_02_24_01.sql @@ -1,3 +1,4 @@ +-- DB update 2026_02_24_00 -> 2026_02_24_01 -- Update creature 'Chapman' with sniffed values -- updated spawns DELETE FROM `creature` WHERE (`id1` IN (34382)) AND (`guid` IN (240228, 240229, 240251, 240252, 240253, 240254, 240255, 240256, 240257, 240258)); diff --git a/data/sql/updates/pending_db_world/rev_1771884996282642200.sql b/data/sql/updates/db_world/2026_02_24_02.sql similarity index 98% rename from data/sql/updates/pending_db_world/rev_1771884996282642200.sql rename to data/sql/updates/db_world/2026_02_24_02.sql index 5388909fb..017ac6e65 100644 --- a/data/sql/updates/pending_db_world/rev_1771884996282642200.sql +++ b/data/sql/updates/db_world/2026_02_24_02.sql @@ -1,3 +1,4 @@ +-- DB update 2026_02_24_01 -> 2026_02_24_02 -- Update creature 'Catrina' with sniffed values -- updated spawns DELETE FROM `creature` WHERE (`id1` IN (34383)) AND (`guid` IN (240226, 240227, 240259, 240260, 240261, 240262, 240263, 240264, 240265, 240266)); From bdba826606e5d4f6199c505fa6fe3b2e807f8c32 Mon Sep 17 00:00:00 2001 From: sudlud Date: Tue, 24 Feb 2026 01:49:00 +0100 Subject: [PATCH 070/150] fix(DB/Gameobject): Sniffed Values for 'Spirit Candle' spawns (#24835) --- .../rev_1771882014186629900.sql | 38 +++++++++++++++++++ 1 file changed, 38 insertions(+) create mode 100644 data/sql/updates/pending_db_world/rev_1771882014186629900.sql diff --git a/data/sql/updates/pending_db_world/rev_1771882014186629900.sql b/data/sql/updates/pending_db_world/rev_1771882014186629900.sql new file mode 100644 index 000000000..58cd9fbae --- /dev/null +++ b/data/sql/updates/pending_db_world/rev_1771882014186629900.sql @@ -0,0 +1,38 @@ +-- Update gameobject 'Spirit Candle' with sniffed values +-- updated spawns +DELETE FROM `gameobject` WHERE (`id` IN (195090)) AND (`guid` IN (240070, 240072, 240080, 240092, 240096, 240099, 240113, 240118, 240123, 240126, 240131, 240133, 240137, 240139, 240146, 240147, 240152, 240155, 240158, 240164, 240165, 240174, 240186, 240193)); +INSERT INTO `gameobject` (`guid`, `id`, `map`, `zoneId`, `areaId`, `spawnMask`, `phaseMask`, `position_x`, `position_y`, `position_z`, `orientation`, `rotation0`, `rotation1`, `rotation2`, `rotation3`, `spawntimesecs`, `animprogress`, `state`, `ScriptName`, `VerifiedBuild`, `Comment`) VALUES +(240070, 195090, 1, 0, 0, 1, 1, 1184.34375, -4469.79150390625, 21.29567146301269531, 3.263772249221801757, 0, 0, -0.99813461303710937, 0.061051756143569946, 120, 255, 1, "", 51943, NULL), +(240072, 195090, 1, 0, 0, 1, 1, 1171.8125, -4463.70166015625, 21.26313972473144531, 3.804818391799926757, 0, 0, -0.94551849365234375, 0.325568377971649169, 120, 255, 1, "", 51943, NULL), +(240080, 195090, 0, 0, 0, 1, 1, -9329.173828125, 184.0850677490234375, 62.915771484375, 3.804818391799926757, 0, 0, -0.94551849365234375, 0.325568377971649169, 120, 255, 1, "", 51943, NULL), +(240092, 195090, 0, 0, 0, 1, 1, -9332.388671875, 174.9496612548828125, 63.12789535522460937, 4.031712055206298828, 0, 0, -0.90258502960205078, 0.430511653423309326, 120, 255, 1, "", 51943, NULL), +(240096, 195090, 571, 0, 0, 1, 1, 5857.65283203125, 765.75, 642.55218505859375, 3.263772249221801757, 0, 0, -0.99813461303710937, 0.061051756143569946, 120, 255, 1, "", 46248, NULL), +(240099, 195090, 571, 0, 0, 1, 1, 5852.61962890625, 768.34027099609375, 642.14642333984375, 3.804818391799926757, 0, 0, -0.94551849365234375, 0.325568377971649169, 120, 255, 1, "", 46248, NULL), +(240113, 195090, 0, 0, 0, 1, 1, 1804.7396240234375, 215.421875, 65.87223052978515625, 1.500982880592346191, 0, 0, 0.681998252868652343, 0.731353819370269775, 120, 255, 1, "", 51943, NULL), +(240118, 195090, 0, 0, 0, 1, 1, 1777.4444580078125, 219.4965362548828125, 59.60799789428710937, 0.15707901120185852, 0, 0, 0.078458786010742187, 0.996917366981506347, 120, 255, 1, "", 51943, NULL), +(240123, 195090, 530, 0, 0, 1, 1, 9406.931640625, -6839.236328125, 16.12152862548828125, 1.500982880592346191, 0, 0, 0.681998252868652343, 0.731353819370269775, 120, 255, 1, "", 51943, NULL), +(240126, 195090, 530, 0, 0, 1, 1, 9419.6396484375, -6851.48974609375, 14.99889087677001953, 3.263772249221801757, 0, 0, -0.99813461303710937, 0.061051756143569946, 120, 255, 1, "", 51943, NULL), +(240131, 195090, 1, 0, 0, 1, 1, 10063.31640625, 2129.739501953125, 1329.6578369140625, 3.263772249221801757, 0, 0, -0.99813461303710937, 0.061051756143569946, 120, 255, 1, "", 51943, NULL), +(240133, 195090, 1, 0, 0, 1, 1, 10049.5517578125, 2113.663330078125, 1329.699951171875, 3.263772249221801757, 0, 0, -0.99813461303710937, 0.061051756143569946, 120, 255, 1, "", 51943, NULL), +(240137, 195090, 1, 0, 0, 1, 1, 10061, 2124.7744140625, 1329.6578369140625, 3.263772249221801757, 0, 0, -0.99813461303710937, 0.061051756143569946, 120, 255, 1, "", 51943, NULL), +(240139, 195090, 1, 0, 0, 1, 1, 10066.6513671875, 2120.208251953125, 1329.6578369140625, 3.263772249221801757, 0, 0, -0.99813461303710937, 0.061051756143569946, 120, 255, 1, "", 51943, NULL), +(240146, 195090, 1, 0, 0, 1, 1, -981.625, -66.9791641235351562, 20.97347450256347656, 3.804818391799926757, 0, 0, -0.94551849365234375, 0.325568377971649169, 120, 255, 1, "", 46368, NULL), +(240147, 195090, 1, 0, 0, 1, 1, -985.3211669921875, -76.3576431274414062, 21.0618743896484375, 3.263772249221801757, 0, 0, -0.99813461303710937, 0.061051756143569946, 120, 255, 1, "", 46368, NULL), +(240152, 195090, 530, 0, 0, 1, 1, -4325.02099609375, -12437.486328125, 17.54513931274414062, 3.804818391799926757, 0, 0, -0.94551849365234375, 0.325568377971649169, 120, 255, 1, "", 51943, NULL), +(240155, 195090, 530, 0, 0, 1, 1, -4323.68212890625, -12439.642578125, 17.47939491271972656, 3.263772249221801757, 0, 0, -0.99813461303710937, 0.061051756143569946, 120, 255, 1, "", 51943, NULL), +(240158, 195090, 530, 0, 0, 1, 1, -4311.05908203125, -12439.4658203125, 17.12792778015136718, 3.263772249221801757, 0, 0, -0.99813461303710937, 0.061051756143569946, 120, 255, 1, "", 51943, NULL), +(240164, 195090, 530, 0, 0, 1, 1, -1791.73095703125, 4917.93603515625, -21.0255756378173828, 2.967041015625, 0, 0, 0.996193885803222656, 0.087165042757987976, 120, 255, 1, "", 51943, NULL), +(240165, 195090, 530, 0, 0, 1, 1, -1789.701416015625, 4922.515625, -21.0878028869628906, 2.478367090225219726, 0, 0, 0.94551849365234375, 0.325568377971649169, 120, 255, 1, "", 51943, NULL), +(240174, 195090, 530, 0, 0, 1, 1, -1784.0103759765625, 4926.54443359375, -21.1391143798828125, 1.937312245368957519, 0, 0, 0.824125289916992187, 0.566407561302185058, 120, 255, 1, "", 51943, NULL), +(240186, 195090, 0, 0, 0, 1, 1, -5163.095703125, -880.0538330078125, 507.278106689453125, 1.361356139183044433, 0, 0, 0.629320144653320312, 0.77714616060256958, 120, 255, 1, "", 51943, NULL), +(240193, 195090, 0, 0, 0, 1, 1, -5160.6162109375, -870.092041015625, 507.264434814453125, 0.977383077144622802, 0, 0, 0.469470977783203125, 0.882947921752929687, 120, 255, 1, "", 51943, NULL); + +-- remove invalid spawns +-- these do not show in sniffs (most likely hand placed spawns) +DELETE FROM `gameobject` WHERE (`id` IN (195090)) AND (`guid` IN (240179, 240180, 240182, 240068, 240181, 240007, 240183, 240194, 240185, 240184, 240192, 240189, 240191, 240188, 240187, 240190, 240076, 240077, 240078, 240089, 240079, 240090, 240088, 240094, 240091, 240081, 240093, 240082, 240083, 240084, 240085, 240086, 240087, 240115, 240114, 240110, 240116, 240117, 240111, 240112, 240145, 240142, 240144, 240143, 240148, 240141, 240134, 240140, 240135, 240136, 240132, 240138, 240127, 240130, 240129, 240128, 240073, 240074, 240071, 240075, 240069, 240163, 240178, 240171, 240172, 240162, 240177, 240173, 240161, 240166, 240168, 240169, 240170, 240167, 240175, 240176, 240160, 240157, 240159, 240149, 240156, 240154, 240150, 240153, 240151, 240119, 240122, 240120, 240124, 240121, 240125, 240106, 240108, 240107, 240105, 240103, 240102, 240104, 240101, 240109, 240100, 240098, 240095, 240097)); +DELETE FROM `gameobject_addon` WHERE (`guid` IN (240179, 240180, 240182, 240068, 240181, 240007, 240183, 240194, 240185, 240184, 240192, 240189, 240191, 240188, 240187, 240190, 240076, 240077, 240078, 240089, 240079, 240090, 240088, 240094, 240091, 240081, 240093, 240082, 240083, 240084, 240085, 240086, 240087, 240115, 240114, 240110, 240116, 240117, 240111, 240112, 240145, 240142, 240144, 240143, 240148, 240141, 240134, 240140, 240135, 240136, 240132, 240138, 240127, 240130, 240129, 240128, 240073, 240074, 240071, 240075, 240069, 240163, 240178, 240171, 240172, 240162, 240177, 240173, 240161, 240166, 240168, 240169, 240170, 240167, 240175, 240176, 240160, 240157, 240159, 240149, 240156, 240154, 240150, 240153, 240151, 240119, 240122, 240120, 240124, 240121, 240125, 240106, 240108, 240107, 240105, 240103, 240102, 240104, 240101, 240109, 240100, 240098, 240095, 240097)); +DELETE FROM `game_event_gameobject` WHERE (`eventEntry` = 51) AND (`guid` IN (240179, 240180, 240182, 240068, 240181, 240007, 240183, 240194, 240185, 240184, 240192, 240189, 240191, 240188, 240187, 240190, 240076, 240077, 240078, 240089, 240079, 240090, 240088, 240094, 240091, 240081, 240093, 240082, 240083, 240084, 240085, 240086, 240087, 240115, 240114, 240110, 240116, 240117, 240111, 240112, 240145, 240142, 240144, 240143, 240148, 240141, 240134, 240140, 240135, 240136, 240132, 240138, 240127, 240130, 240129, 240128, 240073, 240074, 240071, 240075, 240069, 240163, 240178, 240171, 240172, 240162, 240177, 240173, 240161, 240166, 240168, 240169, 240170, 240167, 240175, 240176, 240160, 240157, 240159, 240149, 240156, 240154, 240150, 240153, 240151, 240119, 240122, 240120, 240124, 240121, 240125, 240106, 240108, 240107, 240105, 240103, 240102, 240104, 240101, 240109, 240100, 240098, 240095, 240097)); + +-- enable all spawns for eventEntry 51 +DELETE FROM `game_event_gameobject` WHERE (`eventEntry` = 51) AND (`guid` IN (SELECT `guid` FROM `gameobject` WHERE `id` IN (195090))); +INSERT INTO `game_event_gameobject` (SELECT 51, `guid` FROM `gameobject` WHERE `id` IN (195090)); From 99aa2991cd959aba67ecc08714501c4ba54cd877 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Tue, 24 Feb 2026 00:49:08 +0000 Subject: [PATCH 071/150] chore(DB): import pending files Referenced commit(s): af7e91f9a982941579d532908101d3e239dac9e3 --- .../rev_1771882014186629900.sql => db_world/2026_02_24_03.sql} | 1 + 1 file changed, 1 insertion(+) rename data/sql/updates/{pending_db_world/rev_1771882014186629900.sql => db_world/2026_02_24_03.sql} (99%) diff --git a/data/sql/updates/pending_db_world/rev_1771882014186629900.sql b/data/sql/updates/db_world/2026_02_24_03.sql similarity index 99% rename from data/sql/updates/pending_db_world/rev_1771882014186629900.sql rename to data/sql/updates/db_world/2026_02_24_03.sql index 58cd9fbae..93bd9c441 100644 --- a/data/sql/updates/pending_db_world/rev_1771882014186629900.sql +++ b/data/sql/updates/db_world/2026_02_24_03.sql @@ -1,3 +1,4 @@ +-- DB update 2026_02_24_02 -> 2026_02_24_03 -- Update gameobject 'Spirit Candle' with sniffed values -- updated spawns DELETE FROM `gameobject` WHERE (`id` IN (195090)) AND (`guid` IN (240070, 240072, 240080, 240092, 240096, 240099, 240113, 240118, 240123, 240126, 240131, 240133, 240137, 240139, 240146, 240147, 240152, 240155, 240158, 240164, 240165, 240174, 240186, 240193)); From 1e96a1a46ab88955aef8954e474ebb58b2b04df4 Mon Sep 17 00:00:00 2001 From: sudlud Date: Tue, 24 Feb 2026 01:49:42 +0100 Subject: [PATCH 072/150] fix(DB/Gameobject): Sniffed Values for 'Bread of the Dead' spawns (#24833) --- .../rev_1771880798886137000.sql | 38 +++++++++++++++++++ 1 file changed, 38 insertions(+) create mode 100644 data/sql/updates/pending_db_world/rev_1771880798886137000.sql diff --git a/data/sql/updates/pending_db_world/rev_1771880798886137000.sql b/data/sql/updates/pending_db_world/rev_1771880798886137000.sql new file mode 100644 index 000000000..c9e2bb9fb --- /dev/null +++ b/data/sql/updates/pending_db_world/rev_1771880798886137000.sql @@ -0,0 +1,38 @@ +-- Update gameobject 'Bread of the Dead' with sniffed values +-- updated spawns +DELETE FROM `gameobject` WHERE (`id` IN (195066)) AND (`guid` IN (240285, 240288, 240292, 240293, 240296, 240297, 240299, 240300, 240301, 240305, 240306, 240308, 240311, 240313, 240314, 240317)); +INSERT INTO `gameobject` (`guid`, `id`, `map`, `zoneId`, `areaId`, `spawnMask`, `phaseMask`, `position_x`, `position_y`, `position_z`, `orientation`, `rotation0`, `rotation1`, `rotation2`, `rotation3`, `spawntimesecs`, `animprogress`, `state`, `ScriptName`, `VerifiedBuild`, `Comment`) VALUES +(240285, 195066, 0, 0, 0, 1, 1, -9328.341796875, 170.201385498046875, 61.66754913330078125, 0, 0, 0, 0, 1, 120, 255, 1, "", 51943, NULL), +(240288, 195066, 0, 0, 0, 1, 1, -9327.125, 181.875, 61.65489959716796875, 0, 0, 0, 0, 1, 120, 255, 1, "", 51943, NULL), +(240292, 195066, 0, 0, 0, 1, 1, -5159.9931640625, -869.015625, 507.290924072265625, 0, 0, 0, 0, 1, 120, 255, 1, "", 51943, NULL), +(240293, 195066, 0, 0, 0, 1, 1, -5159.9130859375, -870.5538330078125, 507.307281494140625, 0, 0, 0, 0, 1, 120, 255, 1, "", 51943, NULL), +(240296, 195066, 1, 0, 0, 1, 1, 10065.05078125, 2118.71533203125, 1329.6578369140625, 0, 0, 0, 0, 1, 120, 255, 1, "", 51943, NULL), +(240297, 195066, 1, 0, 0, 1, 1, 10053.484375, 2128.546875, 1329.6578369140625, 0, 0, 0, 0, 1, 120, 255, 1, "", 51943, NULL), +(240299, 195066, 1, 0, 0, 1, 1, 10053.607421875, 2109.585205078125, 1329.647705078125, 0, 0, 0, 0, 1, 120, 255, 1, "", 51943, NULL), +(240300, 195066, 0, 0, 0, 1, 1, 1777.3194580078125, 220.55035400390625, 59.57674789428710937, 0, 0, 0, 0, 1, 120, 255, 1, "", 51943, NULL), +(240301, 195066, 0, 0, 0, 1, 1, 1780.1614990234375, 269.7725830078125, 59.87250518798828125, 0, 0, 0, 0, 1, 120, 255, 1, "", 51943, NULL), +(240305, 195066, 1, 0, 0, 1, 1, 1186.07470703125, -4471.140625, 21.37079811096191406, 0, 0, 0, 0, 1, 120, 255, 1, "", 51943, NULL), +(240306, 195066, 1, 0, 0, 1, 1, 1180.1319580078125, -4457.470703125, 21.48912811279296875, 0, 0, 0, 0, 1, 120, 255, 1, "", 51943, NULL), +(240308, 195066, 1, 0, 0, 1, 1, 1172.30908203125, -4463.2255859375, 21.28818511962890625, 0, 0, 0, 0, 1, 120, 255, 1, "", 51943, NULL), +(240311, 195066, 1, 0, 0, 1, 1, -984.6319580078125, -76.1215286254882812, 20.85416603088378906, 0, 0, 0, 0, 1, 120, 255, 1, "", 46368, NULL), +(240313, 195066, 1, 0, 0, 1, 1, -983.00177001953125, -70.0833358764648437, 20.78368377685546875, 0, 0, 0, 0, 1, 120, 255, 1, "", 46368, NULL), +(240314, 195066, 1, 0, 0, 1, 1, -984.9132080078125, -75.1597213745117187, 20.9375, 0, 0, 0, 0, 1, 120, 255, 1, "", 46368, NULL), +(240317, 195066, 1, 0, 0, 1, 1, -984.30902099609375, -72.329864501953125, 20.99181556701660156, 0, 0, 0, 0, 1, 120, 255, 1, "", 46368, NULL); + +-- new spawns +DELETE FROM `gameobject` WHERE (`id` IN (195066)) AND (`guid` IN (1241, 1242, 1243, 1244, 1245, 1246, 1247, 1248, 1249, 1250)); +INSERT INTO `gameobject` (`guid`, `id`, `map`, `zoneId`, `areaId`, `spawnMask`, `phaseMask`, `position_x`, `position_y`, `position_z`, `orientation`, `rotation0`, `rotation1`, `rotation2`, `rotation3`, `spawntimesecs`, `animprogress`, `state`, `ScriptName`, `VerifiedBuild`, `Comment`) VALUES +(1241, 195066, 530, 0, 0, 1, 1, -1782.203125, 4935.56494140625, -22.6640510559082031, 0, 0, 0, 0, 1, 120, 255, 1, "", 51943, NULL), +(1242, 195066, 530, 0, 0, 1, 1, -1835.9114990234375, 4922.8037109375, -21.2072257995605468, 0, 0, 0, 0, 1, 120, 255, 1, "", 51943, NULL), +(1243, 195066, 530, 0, 0, 1, 1, -4310.30224609375, -12439.513671875, 17.13646507263183593, 0, 0, 0, 0, 1, 120, 255, 1, "", 51943, NULL), +(1244, 195066, 530, 0, 0, 1, 1, -4318.94775390625, -12448.236328125, 17.12119102478027343, 0, 0, 0, 0, 1, 120, 255, 1, "", 51943, NULL), +(1245, 195066, 530, 0, 0, 1, 1, -4319.33837890625, -12455.673828125, 17.32951545715332031, 0, 0, 0, 0, 1, 120, 255, 1, "", 51943, NULL), +(1246, 195066, 530, 0, 0, 1, 1, -4322.93212890625, -12439.4658203125, 17.49305534362792968, 0, 0, 0, 0, 1, 120, 255, 1, "", 51943, NULL), +(1247, 195066, 530, 0, 0, 1, 1, 9418.6708984375, -6849.43603515625, 15.08937931060791015, 0, 0, 0, 0, 1, 120, 255, 1, "", 51943, NULL), +(1248, 195066, 530, 0, 0, 1, 1, 9418.8916015625, -6854.56591796875, 14.94360065460205078, 0, 0, 0, 0, 1, 120, 255, 1, "", 51943, NULL), +(1249, 195066, 571, 0, 0, 1, 1, 5851.9697265625, 771.310791015625, 641.49603271484375, 0, 0, 0, 0, 1, 120, 255, 1, "", 46248, NULL), +(1250, 195066, 571, 0, 0, 1, 1, 5856.6416015625, 765.55731201171875, 641.31524658203125, 0, 0, 0, 0, 1, 120, 255, 1, "", 46248, NULL); + +-- enable all spawns for eventEntry 51 +DELETE FROM `game_event_gameobject` WHERE (`eventEntry` = 51) AND (`guid` IN (SELECT `guid` FROM `gameobject` WHERE `id` IN (195066))); +INSERT INTO `game_event_gameobject` (SELECT 51, `guid` FROM `gameobject` WHERE `id` IN (195066)); From be468b4b35951e999f28bffaf52d671648f02182 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Tue, 24 Feb 2026 00:49:45 +0000 Subject: [PATCH 073/150] chore(DB): import pending files Referenced commit(s): badbf52adc06b2e03b5ae904833726c2bc7388a1 --- .../rev_1771880798886137000.sql => db_world/2026_02_24_04.sql} | 1 + 1 file changed, 1 insertion(+) rename data/sql/updates/{pending_db_world/rev_1771880798886137000.sql => db_world/2026_02_24_04.sql} (99%) diff --git a/data/sql/updates/pending_db_world/rev_1771880798886137000.sql b/data/sql/updates/db_world/2026_02_24_04.sql similarity index 99% rename from data/sql/updates/pending_db_world/rev_1771880798886137000.sql rename to data/sql/updates/db_world/2026_02_24_04.sql index c9e2bb9fb..e237e5a12 100644 --- a/data/sql/updates/pending_db_world/rev_1771880798886137000.sql +++ b/data/sql/updates/db_world/2026_02_24_04.sql @@ -1,3 +1,4 @@ +-- DB update 2026_02_24_03 -> 2026_02_24_04 -- Update gameobject 'Bread of the Dead' with sniffed values -- updated spawns DELETE FROM `gameobject` WHERE (`id` IN (195066)) AND (`guid` IN (240285, 240288, 240292, 240293, 240296, 240297, 240299, 240300, 240301, 240305, 240306, 240308, 240311, 240313, 240314, 240317)); From 5d33af0d4019456ab44e2aa936ee6c543225deb4 Mon Sep 17 00:00:00 2001 From: sudlud Date: Tue, 24 Feb 2026 01:52:05 +0100 Subject: [PATCH 074/150] fix(DB/Gameobject): Sniffed Values for 'Bottle' spawns (#24837) --- .../rev_1771883662965307700.sql | 78 +++++++++++++++++++ 1 file changed, 78 insertions(+) create mode 100644 data/sql/updates/pending_db_world/rev_1771883662965307700.sql diff --git a/data/sql/updates/pending_db_world/rev_1771883662965307700.sql b/data/sql/updates/pending_db_world/rev_1771883662965307700.sql new file mode 100644 index 000000000..aaa5bf11e --- /dev/null +++ b/data/sql/updates/pending_db_world/rev_1771883662965307700.sql @@ -0,0 +1,78 @@ +-- Update gameobject 'Bottle' with sniffed values +-- updated spawns +DELETE FROM `gameobject` WHERE (`id` IN (182807)) AND (`guid` IN (23644, 240263, 240265, 240266, 240267, 240268, 240269, 240270, 240271, 240272, 240273, 240274, 240275, 240276, 240277, 240278)); +INSERT INTO `gameobject` (`guid`, `id`, `map`, `zoneId`, `areaId`, `spawnMask`, `phaseMask`, `position_x`, `position_y`, `position_z`, `orientation`, `rotation0`, `rotation1`, `rotation2`, `rotation3`, `spawntimesecs`, `animprogress`, `state`, `ScriptName`, `VerifiedBuild`, `Comment`) VALUES +(23644, 182807, 530, 0, 0, 1, 1, 9672.1162109375, -7346.4375, 11.93113899230957031, 6.03883981704711914, 0, 0, -0.12186908721923828, 0.9925462007522583, 120, 255, 1, "", 45435, NULL), +(240263, 182807, 1, 0, 0, 1, 1, 1184.0242919921875, -4469.83154296875, 21.28516578674316406, 0, 0, 0, 0, 1, 120, 255, 1, "", 51943, NULL), +(240265, 182807, 0, 0, 0, 1, 1, 1780.1805419921875, 214.78125, 59.85344696044921875, 0, 0, 0, 0, 1, 120, 255, 1, "", 51943, NULL), +(240266, 182807, 0, 0, 0, 1, 1, 1780.763916015625, 215.611114501953125, 59.79877471923828125, 0, 0, 0, 0, 1, 120, 255, 1, "", 51943, NULL), +(240267, 182807, 1, 0, 0, 1, 1, 10063.404296875, 2111.8525390625, 1329.65625, 0, 0, 0, 0, 1, 120, 255, 1, "", 51943, NULL), +(240268, 182807, 1, 0, 0, 1, 1, 10062.7314453125, 2129.979248046875, 1329.6578369140625, 0, 0, 0, 0, 1, 120, 255, 1, "", 51943, NULL), +(240269, 182807, 1, 0, 0, 1, 1, 10065.5224609375, 2118.4619140625, 1329.6578369140625, 0, 0, 0, 0, 1, 120, 255, 1, "", 51943, NULL), +(240270, 182807, 1, 0, 0, 1, 1, 10054.7939453125, 2132.236083984375, 1329.6578369140625, 0, 0, 0, 0, 1, 120, 255, 1, "", 51943, NULL), +(240271, 182807, 1, 0, 0, 1, 1, 10053.69140625, 2125.3056640625, 1329.686767578125, 0, 0, 0, 0, 1, 120, 255, 1, "", 51943, NULL), +(240272, 182807, 0, 0, 0, 1, 1, -5161.265625, -870.734375, 507.233123779296875, 0, 0, 0, 0, 1, 120, 255, 1, "", 51943, NULL), +(240273, 182807, 0, 0, 0, 1, 1, -5160.73291015625, -871.28302001953125, 507.27001953125, 0, 0, 0, 0, 1, 120, 255, 1, "", 51943, NULL), +(240274, 182807, 0, 0, 0, 1, 1, -9326.84765625, 170.8072967529296875, 62.82540512084960937, 0, 0, 0, 0, 1, 120, 255, 1, "", 51943, NULL), +(240275, 182807, 0, 0, 0, 1, 1, -9335.4580078125, 175.404510498046875, 61.60723114013671875, 0, 0, 0, 0, 1, 120, 255, 1, "", 51943, NULL), +(240276, 182807, 1, 0, 0, 1, 1, 1174.357666015625, -4455.34033203125, 21.55141258239746093, 0, 0, 0, 0, 1, 120, 255, 1, "", 51943, NULL), +(240277, 182807, 1, 0, 0, 1, 1, -984.73785400390625, -73.1875, 20.99459648132324218, 0, 0, 0, 0, 1, 120, 255, 1, "", 46368, NULL), +(240278, 182807, 1, 0, 0, 1, 1, -980.77081298828125, -79.8229141235351562, 20.13351821899414062, 0, 0, 0, 0, 1, 120, 255, 1, "", 46368, NULL); + +DELETE FROM `game_event_gameobject` WHERE (`eventEntry` = 51) AND (`guid` IN (23644, 240263, 240265, 240266, 240267, 240268, 240269, 240270, 240271, 240272, 240273, 240274, 240275, 240276, 240277, 240278)); +INSERT INTO `game_event_gameobject` (`eventEntry`,`guid`) VALUES +-- static spawn +-- (51, 23644), +(51, 240263), +(51, 240265), +(51, 240266), +(51, 240267), +(51, 240268), +(51, 240269), +(51, 240270), +(51, 240271), +(51, 240272), +(51, 240273), +(51, 240274), +(51, 240275), +(51, 240276), +(51, 240277), +(51, 240278); + +-- new spawns +DELETE FROM `gameobject` WHERE (`id` IN (182807)) AND (`guid` IN (1806, 1807, 1808, 1809, 1810, 1811, 1812, 1813, 1814, 1815, 1816, 1817, 1818)); +INSERT INTO `gameobject` (`guid`, `id`, `map`, `zoneId`, `areaId`, `spawnMask`, `phaseMask`, `position_x`, `position_y`, `position_z`, `orientation`, `rotation0`, `rotation1`, `rotation2`, `rotation3`, `spawntimesecs`, `animprogress`, `state`, `ScriptName`, `VerifiedBuild`, `Comment`) VALUES +(1806, 182807, 530, 0, 0, 1, 1, -1783.0885009765625, 4936.236328125, -22.6301651000976562, 0, 0, 0, 0, 1, 120, 255, 1, "", 51943, NULL), +(1807, 182807, 530, 0, 0, 1, 1, -1791.9254150390625, 4910.330078125, -21.3478565216064453, 0, 0, 0, 0, 1, 120, 255, 1, "", 51943, NULL), +(1808, 182807, 530, 0, 0, 1, 1, -1836.095458984375, 4923.36279296875, -21.2411785125732421, 0, 0, 0, 0, 1, 120, 255, 1, "", 51943, NULL), +(1809, 182807, 530, 0, 0, 1, 1, -4309.3369140625, -12420.2744140625, 17.54578399658203125, 0, 0, 0, 0, 1, 120, 255, 1, "", 51943, NULL), +(1810, 182807, 530, 0, 0, 1, 1, -4314.44287109375, -12446.46875, 17.27439308166503906, 0, 0, 0, 0, 1, 120, 255, 1, "", 51943, NULL), +(1811, 182807, 530, 0, 0, 1, 1, -4320.0224609375, -12455.6806640625, 17.30128669738769531, 0, 0, 0, 0, 1, 120, 255, 1, "", 51943, NULL), +(1812, 182807, 530, 0, 0, 1, 1, -4320.51904296875, -12453.1630859375, 17.25063705444335937, 0, 0, 0, 0, 1, 120, 255, 1, "", 51943, NULL), +(1813, 182807, 530, 0, 0, 1, 1, -4323.4375, -12438.888671875, 17.51183891296386718, 0, 0, 0, 0, 1, 120, 255, 1, "", 51943, NULL), +(1814, 182807, 530, 0, 0, 1, 1, -4325.0087890625, -12439.8818359375, 17.46257972717285156, 0, 0, 0, 0, 1, 120, 255, 1, "", 51943, NULL), +(1815, 182807, 530, 0, 0, 1, 1, 9417.6826171875, -6856.62841796875, 14.8602142333984375, 0, 0, 0, 0, 1, 120, 255, 1, "", 51943, NULL), +(1816, 182807, 530, 0, 0, 1, 1, 9418.265625, -6855.798828125, 14.89146232604980468, 0, 0, 0, 0, 1, 120, 255, 1, "", 51943, NULL), +(1817, 182807, 571, 0, 0, 1, 1, 5849.689453125, 771.4617919921875, 640.58172607421875, 0, 0, 0, 0, 1, 120, 255, 1, "", 46248, NULL), +(1818, 182807, 571, 0, 0, 1, 1, 5855.94873046875, 765.8055419921875, 641.4307861328125, 0, 0, 0, 0, 1, 120, 255, 1, "", 46248, NULL); + +DELETE FROM `game_event_gameobject` WHERE (`eventEntry` = 51) AND (`guid` IN (1806, 1807, 1808, 1809, 1810, 1811, 1812, 1813, 1814, 1815, 1816, 1817, 1818)); +INSERT INTO `game_event_gameobject` (`eventEntry`,`guid`) VALUES +(51, 1806), +(51, 1807), +(51, 1808), +(51, 1809), +(51, 1810), +(51, 1811), +(51, 1812), +(51, 1813), +(51, 1814), +(51, 1815), +(51, 1816), +(51, 1817), +(51, 1818); + +-- remove duplicate spawns +DELETE FROM `gameobject` WHERE (`id` IN (182807)) AND (`guid` IN (240005, 240264)); +DELETE FROM `gameobject_addon` WHERE (`guid` IN (240005, 240264)); +DELETE FROM `game_event_gameobject` WHERE (`eventEntry` = 51) AND (`guid` IN (240005, 240264)); From 3fb46dd4ae36a0a64a15b6efa67cbf1e496e22b9 Mon Sep 17 00:00:00 2001 From: blinkysc <37940565+blinkysc@users.noreply.github.com> Date: Mon, 23 Feb 2026 18:52:27 -0600 Subject: [PATCH 075/150] fix(Core/Spells): Fix Cut to the Chase S&D duration (#24841) Co-authored-by: blinkysc --- src/server/scripts/Spells/spell_rogue.cpp | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/src/server/scripts/Spells/spell_rogue.cpp b/src/server/scripts/Spells/spell_rogue.cpp index 72aeb1270..b0ffb02a6 100644 --- a/src/server/scripts/Spells/spell_rogue.cpp +++ b/src/server/scripts/Spells/spell_rogue.cpp @@ -844,19 +844,22 @@ class spell_rog_cut_to_the_chase : public AuraScript { PrepareAuraScript(spell_rog_cut_to_the_chase); - void HandleProc(ProcEventInfo& /*eventInfo*/) + void HandleProc(AuraEffect const* /*aurEff*/, ProcEventInfo& eventInfo) { PreventDefaultAction(); - // Refresh Slice and Dice to 5 combo point max duration - if (AuraEffect const* snDEffect = GetTarget()->GetAuraEffect(SPELL_AURA_MOD_MELEE_HASTE, SPELLFAMILY_ROGUE, 0x40000, 0, 0)) + // Refresh Slice and Dice to its 5 combo point maximum duration + Unit* caster = eventInfo.GetActor(); + if (AuraEffect const* snd = caster->GetAuraEffect(SPELL_AURA_MOD_MELEE_HASTE, SPELLFAMILY_ROGUE, 0x40000, 0, 0, caster->GetGUID())) { - snDEffect->GetBase()->SetDuration(snDEffect->GetSpellInfo()->GetMaxDuration(), true); + int32 maxDuration = snd->GetSpellInfo()->GetMaxDuration(); + snd->GetBase()->SetDuration(maxDuration, true); + snd->GetBase()->SetMaxDuration(snd->GetBase()->GetDuration()); } } void Register() override { - OnProc += AuraProcFn(spell_rog_cut_to_the_chase::HandleProc); + OnEffectProc += AuraEffectProcFn(spell_rog_cut_to_the_chase::HandleProc, EFFECT_0, SPELL_AURA_DUMMY); } }; From d1c548d1276aa4bdc899240682c042e1cf8c5bef Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Tue, 24 Feb 2026 00:53:08 +0000 Subject: [PATCH 076/150] chore(DB): import pending files Referenced commit(s): 5d33af0d4019456ab44e2aa936ee6c543225deb4 --- .../rev_1771883662965307700.sql => db_world/2026_02_24_05.sql} | 1 + 1 file changed, 1 insertion(+) rename data/sql/updates/{pending_db_world/rev_1771883662965307700.sql => db_world/2026_02_24_05.sql} (99%) diff --git a/data/sql/updates/pending_db_world/rev_1771883662965307700.sql b/data/sql/updates/db_world/2026_02_24_05.sql similarity index 99% rename from data/sql/updates/pending_db_world/rev_1771883662965307700.sql rename to data/sql/updates/db_world/2026_02_24_05.sql index aaa5bf11e..4d7dfa70f 100644 --- a/data/sql/updates/pending_db_world/rev_1771883662965307700.sql +++ b/data/sql/updates/db_world/2026_02_24_05.sql @@ -1,3 +1,4 @@ +-- DB update 2026_02_24_04 -> 2026_02_24_05 -- Update gameobject 'Bottle' with sniffed values -- updated spawns DELETE FROM `gameobject` WHERE (`id` IN (182807)) AND (`guid` IN (23644, 240263, 240265, 240266, 240267, 240268, 240269, 240270, 240271, 240272, 240273, 240274, 240275, 240276, 240277, 240278)); From b4773da8a2d547d932424286037be5e98df9e5fd Mon Sep 17 00:00:00 2001 From: Kitzunu <24550914+Kitzunu@users.noreply.github.com> Date: Tue, 24 Feb 2026 04:03:44 +0100 Subject: [PATCH 077/150] chore(Github): Update issue labeler action to version 1.0.3 (#24802) --- .github/workflows/issue-labeler.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/issue-labeler.yml b/.github/workflows/issue-labeler.yml index 2c3fd0e99..1a87c1419 100644 --- a/.github/workflows/issue-labeler.yml +++ b/.github/workflows/issue-labeler.yml @@ -11,6 +11,6 @@ jobs: steps: - name: Issue Labeler id: issue-labeler - uses: azerothcore/GitHub-Actions@issue-labeler-1.0.2 + uses: azerothcore/GitHub-Actions@issue-labeler-1.0.3 with: token: ${{ secrets.GITHUB_TOKEN }} From 56d2efc31eda6bbcf57fe153345622b8a9eab1e9 Mon Sep 17 00:00:00 2001 From: Benjamin Jackson <38561765+heyitsbench@users.noreply.github.com> Date: Mon, 23 Feb 2026 22:52:40 -0500 Subject: [PATCH 078/150] fix(Core/AuthSession): Correct typo in query field fetch. (#24842) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: 天鹭 <18535853+PkllonG@users.noreply.github.com> --- src/server/apps/authserver/Server/AuthSession.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/server/apps/authserver/Server/AuthSession.cpp b/src/server/apps/authserver/Server/AuthSession.cpp index ce4a1e590..b0692a03b 100644 --- a/src/server/apps/authserver/Server/AuthSession.cpp +++ b/src/server/apps/authserver/Server/AuthSession.cpp @@ -155,7 +155,7 @@ void AccountInfo::LoadResult(Field* fields) FailedLogins = fields[6].Get(); IsBanned = fields[7].Get() || fields[9].Get(); IsPermanentlyBanned = fields[8].Get() || fields[10].Get(); - SecurityLevel = static_cast(fields[11].Get()) > SEC_CONSOLE ? SEC_CONSOLE : static_cast(fields[12].Get()); + SecurityLevel = static_cast(fields[11].Get()) > SEC_CONSOLE ? SEC_CONSOLE : static_cast(fields[11].Get()); // Use our own uppercasing of the account name instead of using UPPER() in mysql query // This is how the account was created in the first place and changing it now would result in breaking From cd2f222946f53aaeb4c3c2525e6c194b0018460a Mon Sep 17 00:00:00 2001 From: blinkysc <37940565+blinkysc@users.noreply.github.com> Date: Tue, 24 Feb 2026 00:56:30 -0600 Subject: [PATCH 079/150] fix(Core/Spells): Fix negative SPELL_AURA_MOD_DAMAGE_DONE client display (#24843) Co-authored-by: blinkysc Co-authored-by: ariel- --- src/server/game/Spells/Auras/SpellAuraEffects.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/server/game/Spells/Auras/SpellAuraEffects.cpp b/src/server/game/Spells/Auras/SpellAuraEffects.cpp index 1b793832b..5b8599136 100644 --- a/src/server/game/Spells/Auras/SpellAuraEffects.cpp +++ b/src/server/game/Spells/Auras/SpellAuraEffects.cpp @@ -5340,11 +5340,10 @@ void AuraEffect::HandleModDamageDone(AuraApplication const* aurApp, uint8 mode, // This information for client side use only if (target->IsPlayer()) { - uint16 baseField = GetAmount() >= 0 ? PLAYER_FIELD_MOD_DAMAGE_DONE_POS : PLAYER_FIELD_MOD_DAMAGE_DONE_NEG; for (uint16 i = 0; i < MAX_SPELL_SCHOOL; ++i) if (GetMiscValue() & (1 << i)) - target->ApplyModUInt32Value(baseField + i, GetAmount(), apply); + target->ApplyModInt32Value(baseField + i, GetAmount(), apply); if (Guardian* pet = target->ToPlayer()->GetGuardianPet()) pet->UpdateAttackPowerAndDamage(); From 0e562c3209de1c20cb23fc8a85955907f77dbfd5 Mon Sep 17 00:00:00 2001 From: Tereneckla Date: Tue, 24 Feb 2026 15:24:33 +0000 Subject: [PATCH 080/150] fix(DB/Spell): update Maelstrom Weapon PPM (#24845) --- .../updates/pending_db_world/rev_1771922837503577074.sql | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 data/sql/updates/pending_db_world/rev_1771922837503577074.sql diff --git a/data/sql/updates/pending_db_world/rev_1771922837503577074.sql b/data/sql/updates/pending_db_world/rev_1771922837503577074.sql new file mode 100644 index 000000000..22c933cce --- /dev/null +++ b/data/sql/updates/pending_db_world/rev_1771922837503577074.sql @@ -0,0 +1,6 @@ +-- +UPDATE `spell_proc`SET `ProcsPerMinute` = 2 WHERE `SpellId` = 51528; +UPDATE `spell_proc`SET `ProcsPerMinute` = 4 WHERE `SpellId` = 51529; +UPDATE `spell_proc`SET `ProcsPerMinute` = 6 WHERE `SpellId` = 51530; +UPDATE `spell_proc`SET `ProcsPerMinute` = 8 WHERE `SpellId` = 51531; +UPDATE `spell_proc`SET `ProcsPerMinute` = 10 WHERE `SpellId` = 51532; From 9b04591440a38d867348b1392c83c1d8ec43a69e Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Tue, 24 Feb 2026 15:25:43 +0000 Subject: [PATCH 081/150] chore(DB): import pending files Referenced commit(s): 0e562c3209de1c20cb23fc8a85955907f77dbfd5 --- .../rev_1771922837503577074.sql => db_world/2026_02_24_06.sql} | 1 + 1 file changed, 1 insertion(+) rename data/sql/updates/{pending_db_world/rev_1771922837503577074.sql => db_world/2026_02_24_06.sql} (88%) diff --git a/data/sql/updates/pending_db_world/rev_1771922837503577074.sql b/data/sql/updates/db_world/2026_02_24_06.sql similarity index 88% rename from data/sql/updates/pending_db_world/rev_1771922837503577074.sql rename to data/sql/updates/db_world/2026_02_24_06.sql index 22c933cce..cbe15a9e5 100644 --- a/data/sql/updates/pending_db_world/rev_1771922837503577074.sql +++ b/data/sql/updates/db_world/2026_02_24_06.sql @@ -1,3 +1,4 @@ +-- DB update 2026_02_24_05 -> 2026_02_24_06 -- UPDATE `spell_proc`SET `ProcsPerMinute` = 2 WHERE `SpellId` = 51528; UPDATE `spell_proc`SET `ProcsPerMinute` = 4 WHERE `SpellId` = 51529; From 06d16564024bd974ba14ab153f0ee9a94835214d Mon Sep 17 00:00:00 2001 From: Andrew <47818697+Nyeriah@users.noreply.github.com> Date: Tue, 24 Feb 2026 19:34:15 -0300 Subject: [PATCH 082/150] =?UTF-8?q?fix(Scripts/Ulduar):=20Remove=20GUID-ba?= =?UTF-8?q?sed=20harpoon=20identification=20in=20Razors=E2=80=A6=20(#24846?= =?UTF-8?q?)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Keader Co-authored-by: Claude Opus 4.6 --- .../Ulduar/Ulduar/boss_razorscale.cpp | 119 +++++++----------- .../Ulduar/Ulduar/instance_ulduar.cpp | 21 ---- .../scripts/Northrend/Ulduar/Ulduar/ulduar.h | 6 - 3 files changed, 44 insertions(+), 102 deletions(-) diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_razorscale.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_razorscale.cpp index 2a2efb95c..9a0315e9f 100644 --- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_razorscale.cpp +++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_razorscale.cpp @@ -44,7 +44,6 @@ enum Spells SPELL_CHAIN_2 = 49682, SPELL_CHAIN_3 = 49683, SPELL_CHAIN_4 = 49684, - SPELL_LAUNCH_CHAIN = 62505, // Dark Rune Sentinel SPELL_WHIRLWIND = 63808, @@ -207,31 +206,11 @@ struct boss_razorscale : public BossAI void SpellHit(Unit* caster, SpellInfo const* spell) override { - if (!caster || !instance) + if (!caster) return; switch (spell->Id) { - case SPELL_LAUNCH_CHAIN: - { - uint32 spellId = SPELL_CHAIN_4; - - if (caster->GetGUID() == instance->GetGuidData(DATA_HARPOON_FIRE_STATE_1)) - { - spellId = SPELL_CHAIN_1; - } - else if (caster->GetGUID() == instance->GetGuidData(DATA_HARPOON_FIRE_STATE_2)) - { - spellId = SPELL_CHAIN_2; - } - else if (caster->GetGUID() == instance->GetGuidData(DATA_HARPOON_FIRE_STATE_3)) - { - spellId = SPELL_CHAIN_3; - } - - caster->CastSpell(me, spellId, true); - } - break; case SPELL_CHAIN_1: case SPELL_CHAIN_2: case SPELL_CHAIN_3: @@ -447,16 +426,16 @@ struct boss_razorscale : public BossAI events.ScheduleEvent(EVENT_FLY_UP, 2s); break; case EVENT_FLY_UP: + { me->SetInCombatWithZone(); // just in case - if (instance) - for( int i = 0; i < 4; ++i ) - if (Creature* hfs = instance->GetCreature(DATA_HARPOON_FIRE_STATE_1 + i)) - { - me->SummonCreature(34188, hfs->GetPositionX(), hfs->GetPositionY(), hfs->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN, 22000); - hfs->AI()->SetData(1, 0); - } + std::list hfsList; + me->GetCreaturesWithEntryInRange(hfsList, 300.0f, NPC_HARPOON_FIRE_STATE); + for (Creature* hfs : hfsList) + { + me->SummonCreature(34188, hfs->GetPositionX(), hfs->GetPositionY(), hfs->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN, 22000); + hfs->AI()->SetData(1, 0); + } - me->RemoveAura(SPELL_LAUNCH_CHAIN); me->RemoveAura(SPELL_CHAIN_1); me->RemoveAura(SPELL_CHAIN_3); if (RAID_MODE(0, 1)) @@ -506,6 +485,7 @@ struct boss_razorscale : public BossAI } break; + } case EVENT_RESUME_FIXING: for (uint8 i = 0; i < 3; ++i) if (Creature* c = ObjectAccessor::GetCreature(*me, ExpeditionEngineerGUIDs[i])) @@ -621,9 +601,10 @@ public: creature->RemoveNpcFlag(UNIT_NPC_FLAG_GOSSIP); // reset npcs NPC_HARPOON_FIRE_STATE - for (uint8 i = 0; i < 4; ++i) - if (Creature* hfs = instance->GetCreature(DATA_HARPOON_FIRE_STATE_1 + i)) - hfs->AI()->SetData(1, 0); + std::list hfsList; + razorscale->GetCreaturesWithEntryInRange(hfsList, 300.0f, NPC_HARPOON_FIRE_STATE); + for (Creature* hfs : hfsList) + hfs->AI()->SetData(1, 0); if (razorscale->AI()) { @@ -687,18 +668,19 @@ struct npc_ulduar_harpoonfirestate : public NullCreatureAI uint32 GetHarpoonGunIdForThisHFS() { - if (pInstance) - { - if (me->GetGUID() == pInstance->GetGuidData(DATA_HARPOON_FIRE_STATE_1)) - return GO_HARPOON_GUN_1; - else if (me->GetGUID() == pInstance->GetGuidData(DATA_HARPOON_FIRE_STATE_2)) - return GO_HARPOON_GUN_2; - else if (me->GetGUID() == pInstance->GetGuidData(DATA_HARPOON_FIRE_STATE_3)) - return GO_HARPOON_GUN_3; - else - return GO_HARPOON_GUN_4; - } - return 0; + static uint32 const harpoonEntries[] = { GO_HARPOON_GUN_1, GO_HARPOON_GUN_2, GO_HARPOON_GUN_3, GO_HARPOON_GUN_4 }; + for (uint32 entry : harpoonEntries) + if (me->FindNearestGameObject(entry, 5.0f)) + return entry; + + // Fallback: determine by X position + if (me->GetPositionX() > 595) + return GO_HARPOON_GUN_4; + else if (me->GetPositionX() > 585) + return GO_HARPOON_GUN_3; + else if (me->GetPositionX() > 575) + return GO_HARPOON_GUN_2; + return GO_HARPOON_GUN_1; } void SetData(uint32 id, uint32 value) override @@ -706,7 +688,6 @@ struct npc_ulduar_harpoonfirestate : public NullCreatureAI switch (id) { case 1: // cleanup at the start of the fight - if (pInstance) { uint32 h_entry = GetHarpoonGunIdForThisHFS(); if (GameObject* wh = me->FindNearestGameObject(h_entry, 5.0f)) @@ -743,7 +724,7 @@ struct npc_ulduar_harpoonfirestate : public NullCreatureAI if (!razorscale) return; if (!razorscale->HasAura(value)) - me->CastSpell(razorscale, SPELL_LAUNCH_CHAIN, true); + me->CastSpell(razorscale, value, true); } break; } @@ -832,15 +813,16 @@ struct npc_ulduar_expedition_engineer : public NullCreatureAI return; } - for( int i = 0; i < 4; ++i ) - if (Creature* fs = pInstance->GetCreature(DATA_HARPOON_FIRE_STATE_1 + i)) - if (!fs->AI()->GetData(2)) - { - float a = rand_norm() * M_PI; - me->GetMotionMaster()->MovePoint(0, fs->GetPositionX() + 3.0f * cos(a), fs->GetPositionY() + 3.0f * std::sin(a), fs->GetPositionZ()); - fixingGUID = fs->GetGUID(); - return; - } + std::list hfsList; + me->GetCreaturesWithEntryInRange(hfsList, 300.0f, NPC_HARPOON_FIRE_STATE); + for (Creature* fs : hfsList) + if (!fs->AI()->GetData(2)) + { + float a = rand_norm() * M_PI; + me->GetMotionMaster()->MovePoint(0, fs->GetPositionX() + 3.0f * cos(a), fs->GetPositionY() + 3.0f * std::sin(a), fs->GetPositionZ()); + fixingGUID = fs->GetGUID(); + return; + } Reset(); // all harpoons repaired me->GetMotionMaster()->MoveTargetedHome(); @@ -877,30 +859,17 @@ public: return true; } - uint32 npc = 0; uint32 spell = 0; switch (go->GetEntry()) { - case GO_HARPOON_GUN_1: - npc = DATA_HARPOON_FIRE_STATE_1; - spell = SPELL_CHAIN_1; - break; - case GO_HARPOON_GUN_2: - npc = DATA_HARPOON_FIRE_STATE_2; - spell = SPELL_CHAIN_2; - break; - case GO_HARPOON_GUN_3: - npc = DATA_HARPOON_FIRE_STATE_3; - spell = SPELL_CHAIN_3; - break; - case GO_HARPOON_GUN_4: - npc = DATA_HARPOON_FIRE_STATE_4; - spell = SPELL_CHAIN_4; - break; + case GO_HARPOON_GUN_1: spell = SPELL_CHAIN_1; break; + case GO_HARPOON_GUN_2: spell = SPELL_CHAIN_2; break; + case GO_HARPOON_GUN_3: spell = SPELL_CHAIN_3; break; + case GO_HARPOON_GUN_4: spell = SPELL_CHAIN_4; break; } - if (Creature* hfs = pInstance->GetCreature(npc)) - hfs->AI()->SetData(3, spell); + if (Creature* hfs = go->FindNearestCreature(NPC_HARPOON_FIRE_STATE, 5.0f)) + hfs->AI()->SetData(3, spell); go->SetLootState(GO_JUST_DEACTIVATED); return true; diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/instance_ulduar.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/instance_ulduar.cpp index 3d179883c..7d4b0d1d3 100644 --- a/src/server/scripts/Northrend/Ulduar/Ulduar/instance_ulduar.cpp +++ b/src/server/scripts/Northrend/Ulduar/Ulduar/instance_ulduar.cpp @@ -154,9 +154,6 @@ public: uint32 m_unbrokenAchievement; uint32 m_mageBarrier; - // Razorscale - ObjectGuid m_RazorscaleHarpoonFireStateGUID[4]; - // Hodir bool hmHodir; Position normalChestPosition = { 1967.152588f, -204.188461f, 432.686951f, 5.50957f }; @@ -472,18 +469,6 @@ public: if (!m_algalonTimer) creature->DespawnOrUnsummon(); break; - case NPC_HARPOON_FIRE_STATE: - { - if (creature->GetPositionX() > 595 ) - m_RazorscaleHarpoonFireStateGUID[3] = creature->GetGUID(); - else if (creature->GetPositionX() > 585 ) - m_RazorscaleHarpoonFireStateGUID[2] = creature->GetGUID(); - else if (creature->GetPositionX() > 575 ) - m_RazorscaleHarpoonFireStateGUID[1] = creature->GetGUID(); - else - m_RazorscaleHarpoonFireStateGUID[0] = creature->GetGUID(); - } - break; //! These creatures are summoned by something else than Algalon //! but need to be controlled/despawned by him - so they need to be //! registered in his summon list @@ -803,12 +788,6 @@ public: case DATA_REPAIR_STATION2: return m_RepairSGUID[1]; - // Razorscales Harpoon Fire State GUIDs - case DATA_HARPOON_FIRE_STATE_1: - case DATA_HARPOON_FIRE_STATE_2: - case DATA_HARPOON_FIRE_STATE_3: - case DATA_HARPOON_FIRE_STATE_4: - return m_RazorscaleHarpoonFireStateGUID[data - 200]; } return GetObjectGuid(data); diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/ulduar.h b/src/server/scripts/Northrend/Ulduar/Ulduar/ulduar.h index f443536ea..5307e6758 100644 --- a/src/server/scripts/Northrend/Ulduar/Ulduar/ulduar.h +++ b/src/server/scripts/Northrend/Ulduar/Ulduar/ulduar.h @@ -66,12 +66,6 @@ enum UlduarData DATA_UNBROKEN_ACHIEVEMENT = 105, DATA_LEVIATHAN_DOORS = 106, - // Razorscales Harpoon Fire State GUIDs - DATA_HARPOON_FIRE_STATE_1 = 200, - DATA_HARPOON_FIRE_STATE_2 = 201, - DATA_HARPOON_FIRE_STATE_3 = 202, - DATA_HARPOON_FIRE_STATE_4 = 203, - // Mimiron creatures DATA_MIMIRON_LEVIATHAN_MKII = 301, DATA_MIMIRON_VX001 = 302, From 30beeed2aea1ebc778c969225f03fdc809a1c779 Mon Sep 17 00:00:00 2001 From: blinkysc <37940565+blinkysc@users.noreply.github.com> Date: Tue, 24 Feb 2026 17:17:24 -0600 Subject: [PATCH 083/150] fix(Core/Spells): Block SPELL_EFFECT_ENERGIZE_PCT on isolated targets (#24844) Co-authored-by: blinkysc --- src/server/game/Spells/SpellEffects.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/server/game/Spells/SpellEffects.cpp b/src/server/game/Spells/SpellEffects.cpp index 730dc9859..634bde4f1 100644 --- a/src/server/game/Spells/SpellEffects.cpp +++ b/src/server/game/Spells/SpellEffects.cpp @@ -1997,6 +1997,12 @@ void Spell::EffectEnergizePct(SpellEffIndex effIndex) if (!unitTarget->IsAlive()) return; + if (unitTarget->HasUnitState(UNIT_STATE_ISOLATED)) + { + m_caster->SendSpellDamageImmune(unitTarget, GetSpellInfo()->Id); + return; + } + if (m_spellInfo->Effects[effIndex].MiscValue < 0 || m_spellInfo->Effects[effIndex].MiscValue >= int8(MAX_POWERS)) return; From 90d7228222ad58ffd8386352869e0e000b57552c Mon Sep 17 00:00:00 2001 From: blinkysc <37940565+blinkysc@users.noreply.github.com> Date: Tue, 24 Feb 2026 17:17:40 -0600 Subject: [PATCH 084/150] fix(Core/Spells): Fix Piercing Shots to roll remaining damage on refresh (#24852) Co-authored-by: blinkysc --- src/server/scripts/Spells/spell_hunter.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/server/scripts/Spells/spell_hunter.cpp b/src/server/scripts/Spells/spell_hunter.cpp index 8a10dede6..7877a9bd9 100644 --- a/src/server/scripts/Spells/spell_hunter.cpp +++ b/src/server/scripts/Spells/spell_hunter.cpp @@ -1581,7 +1581,7 @@ class spell_hun_piercing_shots : public AuraScript ASSERT(piercingShots->GetMaxTicks() > 0); bp /= piercingShots->GetMaxTicks(); - caster->CastCustomSpell(target, SPELL_HUNTER_PIERCING_SHOTS, &bp, nullptr, nullptr, true, nullptr, aurEff); + target->CastDelayedSpellWithPeriodicAmount(caster, SPELL_HUNTER_PIERCING_SHOTS, SPELL_AURA_PERIODIC_DAMAGE, bp); } void Register() override From 1e73383b54ac1912ccf0ab87db36cce24758f1cb Mon Sep 17 00:00:00 2001 From: blinkysc <37940565+blinkysc@users.noreply.github.com> Date: Tue, 24 Feb 2026 19:04:14 -0600 Subject: [PATCH 085/150] fix(Core/Spells): Restore asserts in SetSpellModTakingSpell (#24862) Co-authored-by: blinkysc --- src/server/game/Entities/Player/Player.cpp | 17 ++--------------- 1 file changed, 2 insertions(+), 15 deletions(-) diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index a27181eec..c2ea1d5f9 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -10028,22 +10028,9 @@ bool Player::HasSpellModApplied(SpellModifier* mod, Spell* spell) void Player::SetSpellModTakingSpell(Spell* spell, bool apply) { if (apply && m_spellModTakingSpell) - { - LOG_INFO("misc", "Player::SetSpellModTakingSpell (A1) - {}, {}", spell->m_spellInfo->Id, m_spellModTakingSpell->m_spellInfo->Id); - return; - //ASSERT(m_spellModTakingSpell == nullptr); - } + ASSERT(m_spellModTakingSpell == nullptr); else if (!apply) - { - if (!m_spellModTakingSpell) - LOG_INFO("misc", "Player::SetSpellModTakingSpell (B1) - {}", spell->m_spellInfo->Id); - else if (m_spellModTakingSpell != spell) - { - LOG_INFO("misc", "Player::SetSpellModTakingSpell (C1) - {}, {}", spell->m_spellInfo->Id, m_spellModTakingSpell->m_spellInfo->Id); - return; - } - //ASSERT(m_spellModTakingSpell && m_spellModTakingSpell == spell); - } + ASSERT(m_spellModTakingSpell && m_spellModTakingSpell == spell); m_spellModTakingSpell = apply ? spell : nullptr; } From 25ff0c9ef491457576092255529cef1f05284c0f Mon Sep 17 00:00:00 2001 From: blinkysc <37940565+blinkysc@users.noreply.github.com> Date: Tue, 24 Feb 2026 19:15:16 -0600 Subject: [PATCH 086/150] fix(Core/Spells): Exempt kill/death events from triggered-spell proc filter (#24859) Co-authored-by: blinkysc --- src/server/game/Spells/Auras/SpellAuras.cpp | 5 +- src/test/mocks/ProcChanceTestHelper.h | 6 +- .../Spells/SpellProcTriggeredFilterTest.cpp | 108 ++++++++++++++++++ 3 files changed, 117 insertions(+), 2 deletions(-) diff --git a/src/server/game/Spells/Auras/SpellAuras.cpp b/src/server/game/Spells/Auras/SpellAuras.cpp index d313b5ca1..9bb9ba9e3 100644 --- a/src/server/game/Spells/Auras/SpellAuras.cpp +++ b/src/server/game/Spells/Auras/SpellAuras.cpp @@ -2164,9 +2164,12 @@ uint8 Aura::GetProcEffectMask(AuraApplication* aurApp, ProcEventInfo& eventInfo, return 0; // check if aura can proc when spell is triggered (exception for hunter auto shot & wands) + // Kill/killed/death events should not be blocked by the triggered-spell check - + // the kill itself is the proc trigger, not the spell that dealt the killing blow if (!GetSpellInfo()->HasAttribute(SPELL_ATTR3_CAN_PROC_FROM_PROCS) && !(procEntry->AttributesMask & PROC_ATTR_TRIGGERED_CAN_PROC) && - !(eventInfo.GetTypeMask() & AUTO_ATTACK_PROC_FLAG_MASK)) + !(eventInfo.GetTypeMask() & AUTO_ATTACK_PROC_FLAG_MASK) && + !(eventInfo.GetTypeMask() & (PROC_FLAG_KILL | PROC_FLAG_KILLED | PROC_FLAG_DEATH))) { if (spell->IsTriggered() && !spell->GetSpellInfo()->HasAttribute(SPELL_ATTR3_NOT_A_PROC)) return 0; diff --git a/src/test/mocks/ProcChanceTestHelper.h b/src/test/mocks/ProcChanceTestHelper.h index 41e0dfa38..6ce878b8f 100644 --- a/src/test/mocks/ProcChanceTestHelper.h +++ b/src/test/mocks/ProcChanceTestHelper.h @@ -268,9 +268,13 @@ public: // Check if triggered spell filtering applies // SpellAuras.cpp:2195-2208 + static constexpr uint32 KILL_DEATH_PROC_FLAG_MASK = + PROC_FLAG_KILL | PROC_FLAG_KILLED | PROC_FLAG_DEATH; + if (!config.auraHasCanProcFromProcs && !(procEntry.AttributesMask & PROC_ATTR_TRIGGERED_CAN_PROC) && - !(eventTypeMask & AUTO_ATTACK_PROC_FLAG_MASK)) + !(eventTypeMask & AUTO_ATTACK_PROC_FLAG_MASK) && + !(eventTypeMask & KILL_DEATH_PROC_FLAG_MASK)) { // Filter triggered spells unless they have NOT_A_PROC if (config.isTriggered && !config.spellHasNotAProc) diff --git a/src/test/server/game/Spells/SpellProcTriggeredFilterTest.cpp b/src/test/server/game/Spells/SpellProcTriggeredFilterTest.cpp index 997425915..d55510e34 100644 --- a/src/test/server/game/Spells/SpellProcTriggeredFilterTest.cpp +++ b/src/test/server/game/Spells/SpellProcTriggeredFilterTest.cpp @@ -251,6 +251,114 @@ TEST_F(SpellProcTriggeredFilterTest, TakenAutoAttack_AllowsTriggeredSpells) << "TAKEN_MELEE_AUTO_ATTACK should allow triggered spells"; } +// ============================================================================= +// PROC_FLAG_KILL / PROC_FLAG_KILLED / PROC_FLAG_DEATH Exception +// Kill/death events bypass the triggered-spell filter because +// the kill itself is the proc trigger, not the spell that dealt +// the killing blow. +// ============================================================================= + +TEST_F(SpellProcTriggeredFilterTest, KillEvent_AllowsTriggeredSpells) +{ + ProcChanceTestHelper::TriggeredSpellConfig config; + config.isTriggered = true; + config.auraHasCanProcFromProcs = false; + config.spellHasNotAProc = false; + + auto procEntry = CreateBasicProcEntry(); + + // PROC_FLAG_KILL should bypass triggered-spell filter + EXPECT_FALSE(ProcChanceTestHelper::ShouldBlockTriggeredSpell( + config, procEntry, PROC_FLAG_KILL)) + << "PROC_FLAG_KILL should allow triggered spells"; +} + +TEST_F(SpellProcTriggeredFilterTest, KilledEvent_AllowsTriggeredSpells) +{ + ProcChanceTestHelper::TriggeredSpellConfig config; + config.isTriggered = true; + config.auraHasCanProcFromProcs = false; + config.spellHasNotAProc = false; + + auto procEntry = CreateBasicProcEntry(); + + // PROC_FLAG_KILLED should bypass triggered-spell filter + EXPECT_FALSE(ProcChanceTestHelper::ShouldBlockTriggeredSpell( + config, procEntry, PROC_FLAG_KILLED)) + << "PROC_FLAG_KILLED should allow triggered spells"; +} + +TEST_F(SpellProcTriggeredFilterTest, DeathEvent_AllowsTriggeredSpells) +{ + ProcChanceTestHelper::TriggeredSpellConfig config; + config.isTriggered = true; + config.auraHasCanProcFromProcs = false; + config.spellHasNotAProc = false; + + auto procEntry = CreateBasicProcEntry(); + + // PROC_FLAG_DEATH should bypass triggered-spell filter + EXPECT_FALSE(ProcChanceTestHelper::ShouldBlockTriggeredSpell( + config, procEntry, PROC_FLAG_DEATH)) + << "PROC_FLAG_DEATH should allow triggered spells"; +} + +TEST_F(SpellProcTriggeredFilterTest, KillWithOtherFlags_StillAllowsTriggeredSpells) +{ + ProcChanceTestHelper::TriggeredSpellConfig config; + config.isTriggered = true; + config.auraHasCanProcFromProcs = false; + config.spellHasNotAProc = false; + + auto procEntry = CreateBasicProcEntry(); + + // PROC_FLAG_KILL combined with other flags should still bypass + uint32 combinedEvent = PROC_FLAG_KILL | PROC_FLAG_DONE_SPELL_MAGIC_DMG_CLASS_NEG; + + EXPECT_FALSE(ProcChanceTestHelper::ShouldBlockTriggeredSpell( + config, procEntry, combinedEvent)) + << "PROC_FLAG_KILL combined with other flags should still bypass filter"; +} + +TEST_F(SpellProcTriggeredFilterTest, Scenario_RapidKilling_AutoShotKill) +{ + // Rapid Killing (34949) has PROC_FLAG_KILL + // Auto Shot (75) repeated casts are IsTriggered=true + // Kill event should proc Rapid Killing regardless + ProcChanceTestHelper::TriggeredSpellConfig config; + config.isTriggered = true; // Auto Shot is triggered + config.auraHasCanProcFromProcs = false; // Rapid Killing doesn't have this + config.spellHasNotAProc = false; // Auto Shot doesn't have NOT_A_PROC + + auto procEntry = SpellProcEntryBuilder() + .WithProcFlags(PROC_FLAG_KILL) + .WithChance(100.0f) + .Build(); + + // PROC_FLAG_KILL exemption should allow this + EXPECT_FALSE(ProcChanceTestHelper::ShouldBlockTriggeredSpell( + config, procEntry, PROC_FLAG_KILL)) + << "Rapid Killing should proc from Auto Shot kill"; +} + +TEST_F(SpellProcTriggeredFilterTest, KillEvent_SelfLoopStillBlocked) +{ + // Even with kill event exemption, self-loop should still be blocked + ProcChanceTestHelper::TriggeredSpellConfig config; + config.isTriggered = true; + config.triggeredByAuraSpellId = 34949; // Same as proc aura + config.procAuraSpellId = 34949; + + auto procEntry = SpellProcEntryBuilder() + .WithProcFlags(PROC_FLAG_KILL) + .WithChance(100.0f) + .Build(); + + EXPECT_TRUE(ProcChanceTestHelper::ShouldBlockTriggeredSpell( + config, procEntry, PROC_FLAG_KILL)) + << "Self-loop should still block even on kill events"; +} + // ============================================================================= // Combined Scenarios // ============================================================================= From b31a9379b8da0bdeed0a11ce936876436bb32b76 Mon Sep 17 00:00:00 2001 From: Andrew <47818697+Nyeriah@users.noreply.github.com> Date: Tue, 24 Feb 2026 22:25:16 -0300 Subject: [PATCH 087/150] fix(Scripts/Ulduar): fix teleporters not activating after boss kills (#24860) Co-authored-by: Vincent-Michael Co-authored-by: Claude Sonnet 4.6 Co-authored-by: Keader --- .../rev_1771973777858165300.sql | 2 ++ .../rev_1771974367980813900.sql | 14 ++++++++ .../Northrend/Ulduar/Ulduar/ulduar.cpp | 36 +++++++++++++++++++ 3 files changed, 52 insertions(+) create mode 100644 data/sql/updates/pending_db_world/rev_1771973777858165300.sql create mode 100644 data/sql/updates/pending_db_world/rev_1771974367980813900.sql diff --git a/data/sql/updates/pending_db_world/rev_1771973777858165300.sql b/data/sql/updates/pending_db_world/rev_1771973777858165300.sql new file mode 100644 index 000000000..515a8ce6e --- /dev/null +++ b/data/sql/updates/pending_db_world/rev_1771973777858165300.sql @@ -0,0 +1,2 @@ +-- +UPDATE `conditions` SET `ConditionValue3` = 2 WHERE `SourceGroup` = 10389 AND `SourceEntry` IN (0, 1, 2, 3, 4, 5, 6, 8) AND `SourceTypeOrReferenceId` = 15; diff --git a/data/sql/updates/pending_db_world/rev_1771974367980813900.sql b/data/sql/updates/pending_db_world/rev_1771974367980813900.sql new file mode 100644 index 000000000..3a4311632 --- /dev/null +++ b/data/sql/updates/pending_db_world/rev_1771974367980813900.sql @@ -0,0 +1,14 @@ +DELETE FROM `smart_scripts` WHERE `entryorguid` = 194569 AND `source_type` = 1 AND `id` IN (0, 1, 2); + +DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId` = 22 AND `SourceGroup` = 2 AND `SourceEntry` = 194569 AND `SourceId` = 1; +DELETE FROM `spell_script_names` WHERE `spell_id` IN (64014, 64024, 64025, 64028, 64029, 64030, 64031, 64032, 65042); +INSERT INTO `spell_script_names` (`spell_id`, `ScriptName`) VALUES +(64014, 'spell_ulduar_teleporter'), +(64024, 'spell_ulduar_teleporter'), +(64025, 'spell_ulduar_teleporter'), +(64028, 'spell_ulduar_teleporter'), +(64029, 'spell_ulduar_teleporter'), +(64030, 'spell_ulduar_teleporter'), +(64031, 'spell_ulduar_teleporter'), +(64032, 'spell_ulduar_teleporter'), +(65042, 'spell_ulduar_teleporter'); diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/ulduar.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/ulduar.cpp index 4a72bf5ab..0601363a2 100644 --- a/src/server/scripts/Northrend/Ulduar/Ulduar/ulduar.cpp +++ b/src/server/scripts/Northrend/Ulduar/Ulduar/ulduar.cpp @@ -23,6 +23,7 @@ #include "Player.h" #include "ScriptedCreature.h" #include "ScriptedGossip.h" +#include "Spell.h" #include "SpellAuraEffects.h" #include "SpellScript.h" #include "SpellScriptLoader.h" @@ -544,9 +545,44 @@ struct npc_salvaged_siege_engine : public VehicleAI } }; +// 64014 - Expedition Base Camp Teleport +// 64024 - Conservatory of Life Teleport +// 64025 - Halls of Invention Teleport +// 64028 - Colossal Forge Teleport +// 64029 - Shattered Walkway Teleport +// 64030 - Antechamber of Ulduar Teleport +// 64031 - Scrapyard Teleport +// 64032 - Formation Grounds Teleport +// 65042 - Prison of Yogg-Saron Teleport +class spell_ulduar_teleporter : public SpellScript +{ + PrepareSpellScript(spell_ulduar_teleporter); + + SpellCastResult CheckRequirement() + { + Unit* target = GetExplTargetUnit(); + if (!target || !target->IsPlayer()) + return SPELL_FAILED_DONT_REPORT; + + if (target->IsInCombat()) + { + Spell::SendCastResult(target->ToPlayer(), GetSpellInfo(), 0, SPELL_FAILED_AFFECTING_COMBAT); + return SPELL_FAILED_AFFECTING_COMBAT; + } + + return SPELL_CAST_OK; + } + + void Register() override + { + OnCheckCast += SpellCheckCastFn(spell_ulduar_teleporter::CheckRequirement); + } +}; + void AddSC_ulduar() { new npc_ulduar_keeper(); + RegisterSpellScript(spell_ulduar_teleporter); RegisterSpellScript(spell_ulduar_energy_sap_aura); RegisterUlduarCreatureAI(npc_ulduar_snow_mound); RegisterUlduarCreatureAI(npc_ulduar_storm_tempered_keeper); From fca1ee550de866bbd3d089d76ca60a13d521142e Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Wed, 25 Feb 2026 01:26:24 +0000 Subject: [PATCH 088/150] chore(DB): import pending files Referenced commit(s): b31a9379b8da0bdeed0a11ce936876436bb32b76 --- .../rev_1771973777858165300.sql => db_world/2026_02_25_00.sql} | 1 + .../rev_1771974367980813900.sql => db_world/2026_02_25_01.sql} | 1 + 2 files changed, 2 insertions(+) rename data/sql/updates/{pending_db_world/rev_1771973777858165300.sql => db_world/2026_02_25_00.sql} (78%) rename data/sql/updates/{pending_db_world/rev_1771974367980813900.sql => db_world/2026_02_25_01.sql} (94%) diff --git a/data/sql/updates/pending_db_world/rev_1771973777858165300.sql b/data/sql/updates/db_world/2026_02_25_00.sql similarity index 78% rename from data/sql/updates/pending_db_world/rev_1771973777858165300.sql rename to data/sql/updates/db_world/2026_02_25_00.sql index 515a8ce6e..0c2545ebc 100644 --- a/data/sql/updates/pending_db_world/rev_1771973777858165300.sql +++ b/data/sql/updates/db_world/2026_02_25_00.sql @@ -1,2 +1,3 @@ +-- DB update 2026_02_24_06 -> 2026_02_25_00 -- UPDATE `conditions` SET `ConditionValue3` = 2 WHERE `SourceGroup` = 10389 AND `SourceEntry` IN (0, 1, 2, 3, 4, 5, 6, 8) AND `SourceTypeOrReferenceId` = 15; diff --git a/data/sql/updates/pending_db_world/rev_1771974367980813900.sql b/data/sql/updates/db_world/2026_02_25_01.sql similarity index 94% rename from data/sql/updates/pending_db_world/rev_1771974367980813900.sql rename to data/sql/updates/db_world/2026_02_25_01.sql index 3a4311632..cb8ab60b1 100644 --- a/data/sql/updates/pending_db_world/rev_1771974367980813900.sql +++ b/data/sql/updates/db_world/2026_02_25_01.sql @@ -1,3 +1,4 @@ +-- DB update 2026_02_25_00 -> 2026_02_25_01 DELETE FROM `smart_scripts` WHERE `entryorguid` = 194569 AND `source_type` = 1 AND `id` IN (0, 1, 2); DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId` = 22 AND `SourceGroup` = 2 AND `SourceEntry` = 194569 AND `SourceId` = 1; From e17df40a570d79eef75f7cba47af32154a3f079f Mon Sep 17 00:00:00 2001 From: blinkysc <37940565+blinkysc@users.noreply.github.com> Date: Tue, 24 Feb 2026 19:38:11 -0600 Subject: [PATCH 089/150] fix(Core/Spells): Fix SetSpellModTakingSpell assert from re-entrant calls (#24863) Co-authored-by: blinkysc --- src/server/game/Entities/Player/Player.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index c2ea1d5f9..532263828 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -10027,10 +10027,10 @@ bool Player::HasSpellModApplied(SpellModifier* mod, Spell* spell) void Player::SetSpellModTakingSpell(Spell* spell, bool apply) { - if (apply && m_spellModTakingSpell) - ASSERT(m_spellModTakingSpell == nullptr); - else if (!apply) - ASSERT(m_spellModTakingSpell && m_spellModTakingSpell == spell); + if (apply && m_spellModTakingSpell && m_spellModTakingSpell != spell) + return; + else if (!apply && m_spellModTakingSpell != spell) + return; m_spellModTakingSpell = apply ? spell : nullptr; } From f88fda4f1972d32d26140cf91432caa9ef5578da Mon Sep 17 00:00:00 2001 From: dataCenter430 <161712630+dataCenter430@users.noreply.github.com> Date: Tue, 24 Feb 2026 21:39:24 -0500 Subject: [PATCH 090/150] feat(Core/LFG): Implement Debug.LFG config option (#24854) --- .../acore_string_debug_lfg_conf.sql | 4 ++++ src/server/apps/worldserver/worldserver.conf.dist | 8 ++++++++ src/server/game/DungeonFinding/LFGMgr.cpp | 14 +++++++++++--- src/server/game/Miscellaneous/Language.h | 3 ++- src/server/game/World/WorldConfig.cpp | 1 + src/server/game/World/WorldConfig.h | 1 + 6 files changed, 27 insertions(+), 4 deletions(-) create mode 100644 data/sql/updates/pending_db_world/acore_string_debug_lfg_conf.sql diff --git a/data/sql/updates/pending_db_world/acore_string_debug_lfg_conf.sql b/data/sql/updates/pending_db_world/acore_string_debug_lfg_conf.sql new file mode 100644 index 000000000..b7411f9e6 --- /dev/null +++ b/data/sql/updates/pending_db_world/acore_string_debug_lfg_conf.sql @@ -0,0 +1,4 @@ +-- Add acore_string for Debug.LFG config message (same pattern as Debug.Battleground / Debug.Arena) +DELETE FROM `acore_string` WHERE `entry` = 30098; +INSERT INTO `acore_string` (`entry`, `content_default`) VALUES +(30098, 'LFG Debugging is already enabled in the config, thus you are unable to enable/disable it with command.'); diff --git a/src/server/apps/worldserver/worldserver.conf.dist b/src/server/apps/worldserver/worldserver.conf.dist index 16d333b21..3bb2c4b85 100644 --- a/src/server/apps/worldserver/worldserver.conf.dist +++ b/src/server/apps/worldserver/worldserver.conf.dist @@ -4666,6 +4666,14 @@ Debug.Battleground = 0 Debug.Arena = 0 +# +# Debug.LFG +# Description: Enable or disable LFG 1 player queue mode. (If enabled, the in-game command is disabled.) +# Default: 0 - (Disabled) +# 1 - (Enabled) + +Debug.LFG = 0 + # ################################################################################################### diff --git a/src/server/game/DungeonFinding/LFGMgr.cpp b/src/server/game/DungeonFinding/LFGMgr.cpp index fe44c400d..61724fa25 100644 --- a/src/server/game/DungeonFinding/LFGMgr.cpp +++ b/src/server/game/DungeonFinding/LFGMgr.cpp @@ -42,7 +42,7 @@ namespace lfg { - LFGMgr::LFGMgr(): m_lfgProposalId(1), m_options(sWorld->getIntConfig(CONFIG_LFG_OPTIONSMASK)), m_Testing(false) + LFGMgr::LFGMgr(): m_lfgProposalId(1), m_options(sWorld->getIntConfig(CONFIG_LFG_OPTIONSMASK)), m_Testing(sWorld->getBoolConfig(CONFIG_DEBUG_LFG)) { for (uint8 team = 0; team < 2; ++team) { @@ -805,8 +805,16 @@ namespace lfg void LFGMgr::ToggleTesting() { - m_Testing = !m_Testing; - ChatHandler(nullptr).SendWorldText(m_Testing ? LANG_DEBUG_LFG_ON : LANG_DEBUG_LFG_OFF); + if (sWorld->getBoolConfig(CONFIG_DEBUG_LFG)) + { + m_Testing = true; + ChatHandler(nullptr).SendWorldText(LANG_DEBUG_LFG_CONF); + } + else + { + m_Testing = !m_Testing; + ChatHandler(nullptr).SendWorldText(m_Testing ? LANG_DEBUG_LFG_ON : LANG_DEBUG_LFG_OFF); + } } /** diff --git a/src/server/game/Miscellaneous/Language.h b/src/server/game/Miscellaneous/Language.h index 31ae7965a..7d76a57cc 100644 --- a/src/server/game/Miscellaneous/Language.h +++ b/src/server/game/Miscellaneous/Language.h @@ -1368,6 +1368,7 @@ enum AcoreStrings // 30087-30095 reserved for passive anticheat LANG_DEBUG_LFG_ON = 30096, - LANG_DEBUG_LFG_OFF = 30097 + LANG_DEBUG_LFG_OFF = 30097, + LANG_DEBUG_LFG_CONF = 30098 }; #endif diff --git a/src/server/game/World/WorldConfig.cpp b/src/server/game/World/WorldConfig.cpp index d0bdfb48c..62759608b 100644 --- a/src/server/game/World/WorldConfig.cpp +++ b/src/server/game/World/WorldConfig.cpp @@ -644,6 +644,7 @@ void WorldConfig::BuildConfigCache() //Debug SetConfigValue(CONFIG_DEBUG_BATTLEGROUND, "Debug.Battleground", false); SetConfigValue(CONFIG_DEBUG_ARENA, "Debug.Arena", false); + SetConfigValue(CONFIG_DEBUG_LFG, "Debug.LFG", false); SetConfigValue(CONFIG_GM_LEVEL_CHANNEL_MODERATION, "Channel.ModerationGMLevel", 1); diff --git a/src/server/game/World/WorldConfig.h b/src/server/game/World/WorldConfig.h index e0408c7fd..3cf19aa21 100644 --- a/src/server/game/World/WorldConfig.h +++ b/src/server/game/World/WorldConfig.h @@ -121,6 +121,7 @@ enum ServerConfigs CONFIG_ITEMDELETE_VENDOR, CONFIG_DEBUG_BATTLEGROUND, CONFIG_DEBUG_ARENA, + CONFIG_DEBUG_LFG, CONFIG_DUNGEON_ACCESS_REQUIREMENTS_PORTAL_CHECK_ILVL, CONFIG_DUNGEON_ACCESS_REQUIREMENTS_LFG_DBC_LEVEL_OVERRIDE, CONFIG_REGEN_HP_CANNOT_REACH_TARGET_IN_RAID, From f3779c8924b37b302b0045e6716d472ea23fb0b0 Mon Sep 17 00:00:00 2001 From: blinkysc <37940565+blinkysc@users.noreply.github.com> Date: Tue, 24 Feb 2026 20:51:15 -0600 Subject: [PATCH 091/150] fix(DB/Spell): Fix Threat of Thassarian not proccing on MH miss/dodge/parry (#24864) Co-authored-by: blinkysc --- data/sql/updates/pending_db_world/rev_1771984985196552455.sql | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 data/sql/updates/pending_db_world/rev_1771984985196552455.sql diff --git a/data/sql/updates/pending_db_world/rev_1771984985196552455.sql b/data/sql/updates/pending_db_world/rev_1771984985196552455.sql new file mode 100644 index 000000000..33227c4d3 --- /dev/null +++ b/data/sql/updates/pending_db_world/rev_1771984985196552455.sql @@ -0,0 +1,4 @@ +-- HitMask 0x477 = PROC_HIT_NORMAL | PROC_HIT_CRITICAL | PROC_HIT_MISS | PROC_HIT_DODGE | PROC_HIT_PARRY | PROC_HIT_BLOCK | PROC_HIT_ABSORB +DELETE FROM `spell_proc` WHERE `SpellId` = -65661; +INSERT INTO `spell_proc` (`SpellId`, `SchoolMask`, `SpellFamilyName`, `SpellFamilyMask0`, `SpellFamilyMask1`, `SpellFamilyMask2`, `ProcFlags`, `SpellTypeMask`, `SpellPhaseMask`, `HitMask`, `AttributesMask`, `DisableEffectsMask`, `ProcsPerMinute`, `Chance`, `Cooldown`, `Charges`) VALUES +(-65661, 0, 15, 4194321, 537001988, 0, 0x10, 0, 2, 0x477, 0, 0, 0, 100, 0, 0); From e28881d0b81c1183859ccdc3961cb2a51b696170 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Wed, 25 Feb 2026 02:52:24 +0000 Subject: [PATCH 092/150] chore(DB): import pending files Referenced commit(s): f88fda4f1972d32d26140cf91432caa9ef5578da --- .../2026_02_25_02.sql} | 1 + .../rev_1771984985196552455.sql => db_world/2026_02_25_03.sql} | 1 + 2 files changed, 2 insertions(+) rename data/sql/updates/{pending_db_world/acore_string_debug_lfg_conf.sql => db_world/2026_02_25_02.sql} (88%) rename data/sql/updates/{pending_db_world/rev_1771984985196552455.sql => db_world/2026_02_25_03.sql} (92%) diff --git a/data/sql/updates/pending_db_world/acore_string_debug_lfg_conf.sql b/data/sql/updates/db_world/2026_02_25_02.sql similarity index 88% rename from data/sql/updates/pending_db_world/acore_string_debug_lfg_conf.sql rename to data/sql/updates/db_world/2026_02_25_02.sql index b7411f9e6..c1fc15a1b 100644 --- a/data/sql/updates/pending_db_world/acore_string_debug_lfg_conf.sql +++ b/data/sql/updates/db_world/2026_02_25_02.sql @@ -1,3 +1,4 @@ +-- DB update 2026_02_25_01 -> 2026_02_25_02 -- Add acore_string for Debug.LFG config message (same pattern as Debug.Battleground / Debug.Arena) DELETE FROM `acore_string` WHERE `entry` = 30098; INSERT INTO `acore_string` (`entry`, `content_default`) VALUES diff --git a/data/sql/updates/pending_db_world/rev_1771984985196552455.sql b/data/sql/updates/db_world/2026_02_25_03.sql similarity index 92% rename from data/sql/updates/pending_db_world/rev_1771984985196552455.sql rename to data/sql/updates/db_world/2026_02_25_03.sql index 33227c4d3..8e6f5a0e1 100644 --- a/data/sql/updates/pending_db_world/rev_1771984985196552455.sql +++ b/data/sql/updates/db_world/2026_02_25_03.sql @@ -1,3 +1,4 @@ +-- DB update 2026_02_25_02 -> 2026_02_25_03 -- HitMask 0x477 = PROC_HIT_NORMAL | PROC_HIT_CRITICAL | PROC_HIT_MISS | PROC_HIT_DODGE | PROC_HIT_PARRY | PROC_HIT_BLOCK | PROC_HIT_ABSORB DELETE FROM `spell_proc` WHERE `SpellId` = -65661; INSERT INTO `spell_proc` (`SpellId`, `SchoolMask`, `SpellFamilyName`, `SpellFamilyMask0`, `SpellFamilyMask1`, `SpellFamilyMask2`, `ProcFlags`, `SpellTypeMask`, `SpellPhaseMask`, `HitMask`, `AttributesMask`, `DisableEffectsMask`, `ProcsPerMinute`, `Chance`, `Cooldown`, `Charges`) VALUES From 37416f0fa0411f1e16b92576c93e4ea717e2e42b Mon Sep 17 00:00:00 2001 From: blinkysc <37940565+blinkysc@users.noreply.github.com> Date: Tue, 24 Feb 2026 21:55:13 -0600 Subject: [PATCH 093/150] fix(DB/Spell): Fix Killing Machine PPM values for ranks 3-5 (#24866) Co-authored-by: blinkysc Co-authored-by: Ariel Bastos --- .../updates/pending_db_world/rev_1771990265346528243.sql | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 data/sql/updates/pending_db_world/rev_1771990265346528243.sql diff --git a/data/sql/updates/pending_db_world/rev_1771990265346528243.sql b/data/sql/updates/pending_db_world/rev_1771990265346528243.sql new file mode 100644 index 000000000..3de1867cf --- /dev/null +++ b/data/sql/updates/pending_db_world/rev_1771990265346528243.sql @@ -0,0 +1,8 @@ +-- Fix Killing Machine PPM values for ranks 3-5 +-- Previous values (1, 2, 4, 6, 8) used non-linear scaling +-- Correct values (1, 2, 3, 4, 5) use linear scaling matching tooltip +-- Formula: attackSpeed * talentRank / 60, yielding talentRank PPM + +UPDATE `spell_proc` SET `ProcsPerMinute` = 3 WHERE `SpellId` = 51128; -- Killing Machine Rank 3 +UPDATE `spell_proc` SET `ProcsPerMinute` = 4 WHERE `SpellId` = 51129; -- Killing Machine Rank 4 +UPDATE `spell_proc` SET `ProcsPerMinute` = 5 WHERE `SpellId` = 51130; -- Killing Machine Rank 5 From 179a188ad0eef8bf0df51ed421ac35fa60de6339 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Wed, 25 Feb 2026 03:57:45 +0000 Subject: [PATCH 094/150] chore(DB): import pending files Referenced commit(s): 37416f0fa0411f1e16b92576c93e4ea717e2e42b --- .../rev_1771990265346528243.sql => db_world/2026_02_25_04.sql} | 1 + 1 file changed, 1 insertion(+) rename data/sql/updates/{pending_db_world/rev_1771990265346528243.sql => db_world/2026_02_25_04.sql} (92%) diff --git a/data/sql/updates/pending_db_world/rev_1771990265346528243.sql b/data/sql/updates/db_world/2026_02_25_04.sql similarity index 92% rename from data/sql/updates/pending_db_world/rev_1771990265346528243.sql rename to data/sql/updates/db_world/2026_02_25_04.sql index 3de1867cf..b4e43f7a0 100644 --- a/data/sql/updates/pending_db_world/rev_1771990265346528243.sql +++ b/data/sql/updates/db_world/2026_02_25_04.sql @@ -1,3 +1,4 @@ +-- DB update 2026_02_25_03 -> 2026_02_25_04 -- Fix Killing Machine PPM values for ranks 3-5 -- Previous values (1, 2, 4, 6, 8) used non-linear scaling -- Correct values (1, 2, 3, 4, 5) use linear scaling matching tooltip From 45ea548ff69445a1da9526606e3675a06d3cb92f Mon Sep 17 00:00:00 2001 From: blinkysc <37940565+blinkysc@users.noreply.github.com> Date: Tue, 24 Feb 2026 23:20:02 -0600 Subject: [PATCH 095/150] fix(Scripts/Spells): Add missing Druid T10 Balance 2P bonus (#24865) Co-authored-by: blinkysc Co-authored-by: Ariel Bastos --- .../pending_db_world/rev_1771984985196552455.sql | 7 +++++++ src/server/scripts/Spells/spell_druid.cpp | 15 +++++++++++++++ 2 files changed, 22 insertions(+) create mode 100644 data/sql/updates/pending_db_world/rev_1771984985196552455.sql diff --git a/data/sql/updates/pending_db_world/rev_1771984985196552455.sql b/data/sql/updates/pending_db_world/rev_1771984985196552455.sql new file mode 100644 index 000000000..6f913477f --- /dev/null +++ b/data/sql/updates/pending_db_world/rev_1771984985196552455.sql @@ -0,0 +1,7 @@ +-- Threat of Thassarian: OH attack should fire even when MH misses/dodges/parries +-- SpellTypeMask 0 = don't filter by spell type (miss/dodge/parry have no damage, so +-- PROC_SPELL_TYPE_DAMAGE won't match - need to allow PROC_SPELL_TYPE_NO_DMG_HEAL too) +-- HitMask 0x477 = PROC_HIT_NORMAL | PROC_HIT_CRITICAL | PROC_HIT_MISS | PROC_HIT_DODGE | PROC_HIT_PARRY | PROC_HIT_BLOCK | PROC_HIT_ABSORB +DELETE FROM `spell_proc` WHERE `SpellId` = -65661; +INSERT INTO `spell_proc` (`SpellId`, `SchoolMask`, `SpellFamilyName`, `SpellFamilyMask0`, `SpellFamilyMask1`, `SpellFamilyMask2`, `ProcFlags`, `SpellTypeMask`, `SpellPhaseMask`, `HitMask`, `AttributesMask`, `DisableEffectsMask`, `ProcsPerMinute`, `Chance`, `Cooldown`, `Charges`) VALUES +(-65661, 0, 15, 4194321, 537001988, 0, 0x10, 0, 2, 0x477, 0, 0, 0, 100, 0, 0); diff --git a/src/server/scripts/Spells/spell_druid.cpp b/src/server/scripts/Spells/spell_druid.cpp index 2bac18112..fea4d869e 100644 --- a/src/server/scripts/Spells/spell_druid.cpp +++ b/src/server/scripts/Spells/spell_druid.cpp @@ -88,6 +88,8 @@ enum DruidSpells SPELL_DRUID_GLYPH_OF_RIP = 54818, SPELL_DRUID_RIP_DURATION_LACERATE_DMG = 60141, SPELL_DRUID_REJUVENATION_T10_PROC = 70691, + SPELL_DRUID_BALANCE_T10_BONUS = 70718, + SPELL_DRUID_BALANCE_T10_BONUS_PROC = 70721, SPELL_DRUID_LANGUISH = 71023, // T9 Feral Relic SPELL_DRUID_T9_FERAL_RELIC_BEAR = 67354, @@ -234,6 +236,11 @@ class spell_dru_omen_of_clarity : public AuraScript { PrepareAuraScript(spell_dru_omen_of_clarity); + bool Validate(SpellInfo const* /*spellInfo*/) override + { + return ValidateSpellInfo({ SPELL_DRUID_BALANCE_T10_BONUS, SPELL_DRUID_BALANCE_T10_BONUS_PROC }); + } + bool CheckProc(ProcEventInfo& eventInfo) { SpellInfo const* spellInfo = eventInfo.GetSpellInfo(); @@ -268,9 +275,17 @@ class spell_dru_omen_of_clarity : public AuraScript return true; } + void HandleProc(AuraEffect const* aurEff, ProcEventInfo& /*eventInfo*/) + { + Unit* target = GetTarget(); + if (target->HasAura(SPELL_DRUID_BALANCE_T10_BONUS)) + target->CastSpell(nullptr, SPELL_DRUID_BALANCE_T10_BONUS_PROC, true, nullptr, aurEff); + } + void Register() override { DoCheckProc += AuraCheckProcFn(spell_dru_omen_of_clarity::CheckProc); + OnEffectProc += AuraEffectProcFn(spell_dru_omen_of_clarity::HandleProc, EFFECT_0, SPELL_AURA_PROC_TRIGGER_SPELL); } }; From 3cb5c9685fe44843b6c2a8e8f77202f687ef98a9 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Wed, 25 Feb 2026 05:21:06 +0000 Subject: [PATCH 096/150] chore(DB): import pending files Referenced commit(s): 45ea548ff69445a1da9526606e3675a06d3cb92f --- .../rev_1771984985196552455.sql => db_world/2026_02_25_05.sql} | 1 + 1 file changed, 1 insertion(+) rename data/sql/updates/{pending_db_world/rev_1771984985196552455.sql => db_world/2026_02_25_05.sql} (94%) diff --git a/data/sql/updates/pending_db_world/rev_1771984985196552455.sql b/data/sql/updates/db_world/2026_02_25_05.sql similarity index 94% rename from data/sql/updates/pending_db_world/rev_1771984985196552455.sql rename to data/sql/updates/db_world/2026_02_25_05.sql index 6f913477f..e4146818c 100644 --- a/data/sql/updates/pending_db_world/rev_1771984985196552455.sql +++ b/data/sql/updates/db_world/2026_02_25_05.sql @@ -1,3 +1,4 @@ +-- DB update 2026_02_25_04 -> 2026_02_25_05 -- Threat of Thassarian: OH attack should fire even when MH misses/dodges/parries -- SpellTypeMask 0 = don't filter by spell type (miss/dodge/parry have no damage, so -- PROC_SPELL_TYPE_DAMAGE won't match - need to allow PROC_SPELL_TYPE_NO_DMG_HEAL too) From bb10c2c5411e3277408390f7793ef3883490db0c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=A4=A9=E9=B9=AD?= <18535853+PkllonG@users.noreply.github.com> Date: Wed, 25 Feb 2026 15:18:12 +0800 Subject: [PATCH 097/150] fix(SpellEffects): GameObject Rotation (#24850) --- src/server/game/Spells/SpellEffects.cpp | 12 ++++++++---- src/server/scripts/Commands/cs_gobject.cpp | 3 ++- src/server/scripts/OutdoorPvP/OutdoorPvPSI.cpp | 6 ++++-- 3 files changed, 14 insertions(+), 7 deletions(-) diff --git a/src/server/game/Spells/SpellEffects.cpp b/src/server/game/Spells/SpellEffects.cpp index 634bde4f1..5e4bc73c6 100644 --- a/src/server/game/Spells/SpellEffects.cpp +++ b/src/server/game/Spells/SpellEffects.cpp @@ -3761,7 +3761,8 @@ void Spell::EffectSummonObjectWild(SpellEffIndex effIndex) Map* map = target->GetMap(); - if (!pGameObj->Create(map->GenerateLowGuid(), gameobject_id, map, m_caster->GetPhaseMask(), x, y, z, target->GetOrientation(), G3D::Quat(), 100, GO_STATE_READY)) + G3D::Quat rotation = G3D::Quat::fromAxisAngleRotation(G3D::Vector3::unitZ(), target->GetOrientation()); + if (!pGameObj->Create(map->GenerateLowGuid(), gameobject_id, map, m_caster->GetPhaseMask(), x, y, z, target->GetOrientation(), rotation, 100, GO_STATE_READY)) { delete pGameObj; return; @@ -4109,12 +4110,13 @@ void Spell::EffectDuel(SpellEffIndex effIndex) GameObject* pGameObj = sObjectMgr->IsGameObjectStaticTransport(gameobject_id) ? new StaticTransport() : new GameObject(); Map* map = m_caster->GetMap(); + G3D::Quat rotation = G3D::Quat::fromAxisAngleRotation(G3D::Vector3::unitZ(), m_caster->GetOrientation()); if (!pGameObj->Create(map->GenerateLowGuid(), gameobject_id, map, m_caster->GetPhaseMask(), m_caster->GetPositionX() + (unitTarget->GetPositionX() - m_caster->GetPositionX()) / 2, m_caster->GetPositionY() + (unitTarget->GetPositionY() - m_caster->GetPositionY()) / 2, m_caster->GetPositionZ(), - m_caster->GetOrientation(), G3D::Quat(), 0, GO_STATE_READY)) + m_caster->GetOrientation(), rotation, 0, GO_STATE_READY)) { delete pGameObj; return; @@ -4590,7 +4592,8 @@ void Spell::EffectSummonObject(SpellEffIndex effIndex) m_caster->GetClosePoint(x, y, z, DEFAULT_WORLD_OBJECT_SIZE); Map* map = m_caster->GetMap(); - if (!pGameObj->Create(map->GenerateLowGuid(), gameobjectId, map, m_caster->GetPhaseMask(), x, y, z, m_caster->GetOrientation(), G3D::Quat(), 0, GO_STATE_READY)) + G3D::Quat rotation = G3D::Quat::fromAxisAngleRotation(G3D::Vector3::unitZ(), m_caster->GetOrientation()); + if (!pGameObj->Create(map->GenerateLowGuid(), gameobjectId, map, m_caster->GetPhaseMask(), x, y, z, m_caster->GetOrientation(), rotation, 0, GO_STATE_READY)) { delete pGameObj; return; @@ -5394,7 +5397,8 @@ void Spell::EffectTransmitted(SpellEffIndex effIndex) GameObject* pGameObj = sObjectMgr->IsGameObjectStaticTransport(name_id) ? new StaticTransport() : new GameObject(); - if (!pGameObj->Create(cMap->GenerateLowGuid(), name_id, cMap, m_caster->GetPhaseMask(), fx, fy, fz, m_caster->GetOrientation(), G3D::Quat(), 100, GO_STATE_READY)) + G3D::Quat rotation = G3D::Quat::fromAxisAngleRotation(G3D::Vector3::unitZ(), m_caster->GetOrientation()); + if (!pGameObj->Create(cMap->GenerateLowGuid(), name_id, cMap, m_caster->GetPhaseMask(), fx, fy, fz, m_caster->GetOrientation(), rotation, 100, GO_STATE_READY)) { delete pGameObj; return; diff --git a/src/server/scripts/Commands/cs_gobject.cpp b/src/server/scripts/Commands/cs_gobject.cpp index c23832e99..50ccde003 100644 --- a/src/server/scripts/Commands/cs_gobject.cpp +++ b/src/server/scripts/Commands/cs_gobject.cpp @@ -117,7 +117,8 @@ public: GameObject* object = sObjectMgr->IsGameObjectStaticTransport(objectInfo->entry) ? new StaticTransport() : new GameObject(); ObjectGuid::LowType guidLow = map->GenerateLowGuid(); - if (!object->Create(guidLow, objectInfo->entry, map, player->GetPhaseMaskForSpawn(), x, y, z, o, G3D::Quat(), 0, GO_STATE_READY)) + G3D::Quat rotation = G3D::Quat::fromAxisAngleRotation(G3D::Vector3::unitZ(), o); + if (!object->Create(guidLow, objectInfo->entry, map, player->GetPhaseMaskForSpawn(), x, y, z, o, rotation, 0, GO_STATE_READY)) { delete object; return false; diff --git a/src/server/scripts/OutdoorPvP/OutdoorPvPSI.cpp b/src/server/scripts/OutdoorPvP/OutdoorPvPSI.cpp index 6221ee83b..33e2fb9fa 100644 --- a/src/server/scripts/OutdoorPvP/OutdoorPvPSI.cpp +++ b/src/server/scripts/OutdoorPvP/OutdoorPvPSI.cpp @@ -177,7 +177,8 @@ bool OutdoorPvPSI::HandleDropFlag(Player* player, uint32 spellId) return true; } - if (!go->Create(map->GenerateLowGuid(), SI_SILITHYST_MOUND, map, player->GetPhaseMask(), player->GetPositionX(), player->GetPositionY(), player->GetPositionZ(), player->GetOrientation(), G3D::Quat(), 100, GO_STATE_READY)) + G3D::Quat rotation = G3D::Quat::fromAxisAngleRotation(G3D::Vector3::unitZ(), player->GetOrientation()); + if (!go->Create(map->GenerateLowGuid(), SI_SILITHYST_MOUND, map, player->GetPhaseMask(), player->GetPositionX(), player->GetPositionY(), player->GetPositionZ(), player->GetOrientation(), rotation, 100, GO_STATE_READY)) { delete go; return true; @@ -211,7 +212,8 @@ bool OutdoorPvPSI::HandleDropFlag(Player* player, uint32 spellId) return true; } - if (!go->Create(map->GenerateLowGuid(), SI_SILITHYST_MOUND, map, player->GetPhaseMask(), player->GetPositionX(), player->GetPositionY(), player->GetPositionZ(), player->GetOrientation(), G3D::Quat(), 100, GO_STATE_READY)) + G3D::Quat rotation = G3D::Quat::fromAxisAngleRotation(G3D::Vector3::unitZ(), player->GetOrientation()); + if (!go->Create(map->GenerateLowGuid(), SI_SILITHYST_MOUND, map, player->GetPhaseMask(), player->GetPositionX(), player->GetPositionY(), player->GetPositionZ(), player->GetOrientation(), rotation, 100, GO_STATE_READY)) { delete go; return true; From c990b7ad31aeea15b5b3c8137ba77589830f6c7b Mon Sep 17 00:00:00 2001 From: sudlud Date: Wed, 25 Feb 2026 14:38:29 +0100 Subject: [PATCH 098/150] fix(DB/Gameobject): Sniffed Values for 'Serpentshrine Console' spawns (#24861) --- .../updates/pending_db_world/rev_1771976066531376600.sql | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 data/sql/updates/pending_db_world/rev_1771976066531376600.sql diff --git a/data/sql/updates/pending_db_world/rev_1771976066531376600.sql b/data/sql/updates/pending_db_world/rev_1771976066531376600.sql new file mode 100644 index 000000000..6756e4862 --- /dev/null +++ b/data/sql/updates/pending_db_world/rev_1771976066531376600.sql @@ -0,0 +1,7 @@ +-- Update gameobject 'Serpentshrine Console' with sniffed values +-- new spawns +DELETE FROM `gameobject` WHERE (`id` IN (185115, 185117, 185118)) AND (`guid` IN (191, 192, 193)); +INSERT INTO `gameobject` (`guid`, `id`, `map`, `zoneId`, `areaId`, `spawnMask`, `phaseMask`, `position_x`, `position_y`, `position_z`, `orientation`, `rotation0`, `rotation1`, `rotation2`, `rotation3`, `spawntimesecs`, `animprogress`, `state`, `ScriptName`, `VerifiedBuild`, `Comment`) VALUES +(191, 185115, 548, 0, 0, 1, 1, 373.139404296875, -465.10626220703125, 30.71641731262207031, 3.22885894775390625, 0, 0, -0.99904823303222656, 0.043619260191917419, 7200, 255, 0, "", 49345, NULL), +(192, 185117, 548, 0, 0, 1, 1, -245.729354858398437, -381.39300537109375, -0.18703900277614593, 2.879789113998413085, 0, 0, 0.991444587707519531, 0.130528271198272705, 7200, 255, 0, "", 49345, NULL), +(193, 185118, 548, 0, 0, 1, 1, 123.2582168579101562, -432.356719970703125, -1.19655394554138183, 4.799657344818115234, 0, 0, -0.67558956146240234, 0.737277925014495849, 7200, 255, 0, "", 49345, NULL); From af567db104173e7b79143c114fb7ee81d5898221 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Wed, 25 Feb 2026 13:39:36 +0000 Subject: [PATCH 099/150] chore(DB): import pending files Referenced commit(s): c990b7ad31aeea15b5b3c8137ba77589830f6c7b --- .../rev_1771976066531376600.sql => db_world/2026_02_25_06.sql} | 1 + 1 file changed, 1 insertion(+) rename data/sql/updates/{pending_db_world/rev_1771976066531376600.sql => db_world/2026_02_25_06.sql} (96%) diff --git a/data/sql/updates/pending_db_world/rev_1771976066531376600.sql b/data/sql/updates/db_world/2026_02_25_06.sql similarity index 96% rename from data/sql/updates/pending_db_world/rev_1771976066531376600.sql rename to data/sql/updates/db_world/2026_02_25_06.sql index 6756e4862..6219aed98 100644 --- a/data/sql/updates/pending_db_world/rev_1771976066531376600.sql +++ b/data/sql/updates/db_world/2026_02_25_06.sql @@ -1,3 +1,4 @@ +-- DB update 2026_02_25_05 -> 2026_02_25_06 -- Update gameobject 'Serpentshrine Console' with sniffed values -- new spawns DELETE FROM `gameobject` WHERE (`id` IN (185115, 185117, 185118)) AND (`guid` IN (191, 192, 193)); From 3eab74da3a07ab94257ec02cea359f06dceb87fb Mon Sep 17 00:00:00 2001 From: blinkysc <37940565+blinkysc@users.noreply.github.com> Date: Wed, 25 Feb 2026 08:56:37 -0600 Subject: [PATCH 100/150] fix(DB/Loot): Remove duplicate Void Crystal from disenchant entry 67 (#24871) Co-authored-by: blinkysc Co-authored-by: Gultask <100873791+Gultask@users.noreply.github.com> --- .../pending_db_world/rev_1772001496427044016.sql | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 data/sql/updates/pending_db_world/rev_1772001496427044016.sql diff --git a/data/sql/updates/pending_db_world/rev_1772001496427044016.sql b/data/sql/updates/pending_db_world/rev_1772001496427044016.sql new file mode 100644 index 000000000..3b5a5a090 --- /dev/null +++ b/data/sql/updates/pending_db_world/rev_1772001496427044016.sql @@ -0,0 +1,11 @@ +-- Remove erroneous reference from disenchant entry 67 that causes double Void Crystal drops +-- Entry 67 already guarantees 1 Void Crystal (GroupId=0, 100% chance) +-- The reference to table 44012 (GroupId=1, 67% chance) added a second Void Crystal +DELETE FROM `disenchant_loot_template` WHERE `Entry` = 67 AND `Item` = 44012; +DELETE FROM `reference_loot_template` WHERE (`Entry` = 44012); + +DELETE FROM `reference_loot_template` WHERE (`Entry` = 34097); +INSERT INTO `reference_loot_template` (`Entry`, `Item`, `Reference`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES +(34097, 29765, 0, 0, 0, 1, 1, 1, 1, 'Leggings of the Fallen Hero'), +(34097, 29766, 0, 0, 0, 1, 1, 1, 1, 'Leggings of the Fallen Champion'), +(34097, 29767, 0, 0, 0, 1, 1, 1, 1, 'Leggings of the Fallen Defender'); From e3f4a0e09233e55c71c24a89bf0cb35de7557f52 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Wed, 25 Feb 2026 14:57:51 +0000 Subject: [PATCH 101/150] chore(DB): import pending files Referenced commit(s): 3eab74da3a07ab94257ec02cea359f06dceb87fb --- .../rev_1772001496427044016.sql => db_world/2026_02_25_07.sql} | 1 + 1 file changed, 1 insertion(+) rename data/sql/updates/{pending_db_world/rev_1772001496427044016.sql => db_world/2026_02_25_07.sql} (94%) diff --git a/data/sql/updates/pending_db_world/rev_1772001496427044016.sql b/data/sql/updates/db_world/2026_02_25_07.sql similarity index 94% rename from data/sql/updates/pending_db_world/rev_1772001496427044016.sql rename to data/sql/updates/db_world/2026_02_25_07.sql index 3b5a5a090..077f07150 100644 --- a/data/sql/updates/pending_db_world/rev_1772001496427044016.sql +++ b/data/sql/updates/db_world/2026_02_25_07.sql @@ -1,3 +1,4 @@ +-- DB update 2026_02_25_06 -> 2026_02_25_07 -- Remove erroneous reference from disenchant entry 67 that causes double Void Crystal drops -- Entry 67 already guarantees 1 Void Crystal (GroupId=0, 100% chance) -- The reference to table 44012 (GroupId=1, 67% chance) added a second Void Crystal From 823bf84a1243598593c27d0f2921919c01ff2e0e Mon Sep 17 00:00:00 2001 From: blinkysc <37940565+blinkysc@users.noreply.github.com> Date: Wed, 25 Feb 2026 10:12:13 -0600 Subject: [PATCH 102/150] chore(Scripts/Spells): Remove duplicate Shaman T8 Electrified script (#24869) Co-authored-by: blinkysc --- .../fix_shaman_t8_electrified_double_proc.sql | 2 + src/server/scripts/Spells/spell_shaman.cpp | 56 +++---------------- 2 files changed, 11 insertions(+), 47 deletions(-) create mode 100644 data/sql/updates/pending_db_world/fix_shaman_t8_electrified_double_proc.sql diff --git a/data/sql/updates/pending_db_world/fix_shaman_t8_electrified_double_proc.sql b/data/sql/updates/pending_db_world/fix_shaman_t8_electrified_double_proc.sql new file mode 100644 index 000000000..68bcbf01a --- /dev/null +++ b/data/sql/updates/pending_db_world/fix_shaman_t8_electrified_double_proc.sql @@ -0,0 +1,2 @@ +-- Remove stale spell_script_names entry for spell_sha_t8_electrified. +DELETE FROM `spell_script_names` WHERE `spell_id` = 64928 AND `ScriptName` = 'spell_sha_t8_electrified'; diff --git a/src/server/scripts/Spells/spell_shaman.cpp b/src/server/scripts/Spells/spell_shaman.cpp index 03ce3b39c..8490f4b34 100644 --- a/src/server/scripts/Spells/spell_shaman.cpp +++ b/src/server/scripts/Spells/spell_shaman.cpp @@ -1296,45 +1296,6 @@ class spell_sha_flurry_proc : public AuraScript } }; -// 64928 - Item - Shaman T8 Elemental 4P Bonus -class spell_sha_t8_electrified : public AuraScript -{ - PrepareAuraScript(spell_sha_t8_electrified); - - bool Validate(SpellInfo const* /*spellInfo*/) override - { - return ValidateSpellInfo({ SPELL_SHAMAN_ELECTRIFIED }); - } - - void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) - { - PreventDefaultAction(); - - DamageInfo* damageInfo = eventInfo.GetDamageInfo(); - if (!damageInfo || !damageInfo->GetDamage()) - return; - - // Do not proc from Lightning Overload (patch 3.1~) - if (SpellInfo const* spellInfo = eventInfo.GetSpellInfo()) - { - if (spellInfo->Id == SPELL_SHAMAN_LIGHTNING_BOLT_OVERLOAD) - { - return; - } - } - - SpellInfo const* electrifiedDot = sSpellMgr->AssertSpellInfo(SPELL_SHAMAN_ELECTRIFIED); - int32 amount = int32(CalculatePct(eventInfo.GetDamageInfo()->GetDamage(), aurEff->GetAmount()) / electrifiedDot->GetMaxTicks()); - - eventInfo.GetProcTarget()->CastDelayedSpellWithPeriodicAmount(eventInfo.GetActor(), SPELL_SHAMAN_ELECTRIFIED, SPELL_AURA_PERIODIC_DAMAGE, amount); - } - - void Register() override - { - OnEffectProc += AuraEffectProcFn(spell_sha_t8_electrified::HandleProc, EFFECT_0, SPELL_AURA_DUMMY); - } -}; - // 55440 - Glyph of Healing Wave class spell_sha_glyph_of_healing_wave : public AuraScript { @@ -2063,16 +2024,18 @@ class spell_sha_t8_elemental_4p_bonus : public AuraScript if (!damageInfo || !damageInfo->GetDamage()) return; - SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(SPELL_SHAMAN_ELECTRIFIED); - if (!spellInfo) - return; + // Do not proc from Lightning Overload (patch 3.1~) + if (SpellInfo const* spellInfo = eventInfo.GetSpellInfo()) + { + if (spellInfo->Id == SPELL_SHAMAN_LIGHTNING_BOLT_OVERLOAD) + return; + } + SpellInfo const* electrifiedDot = sSpellMgr->AssertSpellInfo(SPELL_SHAMAN_ELECTRIFIED); int32 amount = CalculatePct(static_cast(damageInfo->GetDamage()), aurEff->GetAmount()); - amount /= spellInfo->GetMaxTicks(); + amount /= electrifiedDot->GetMaxTicks(); - Unit* caster = eventInfo.GetActor(); - Unit* target = eventInfo.GetActionTarget(); - target->CastDelayedSpellWithPeriodicAmount(caster, SPELL_SHAMAN_ELECTRIFIED, SPELL_AURA_PERIODIC_DAMAGE, amount); + eventInfo.GetProcTarget()->CastDelayedSpellWithPeriodicAmount(eventInfo.GetActor(), SPELL_SHAMAN_ELECTRIFIED, SPELL_AURA_PERIODIC_DAMAGE, amount); } void Register() override @@ -2242,7 +2205,6 @@ void AddSC_shaman_spell_scripts() RegisterSpellScript(spell_sha_stoneclaw_totem); RegisterSpellScript(spell_sha_thunderstorm); RegisterSpellScript(spell_sha_flurry_proc); - RegisterSpellScript(spell_sha_t8_electrified); RegisterSpellScript(spell_sha_glyph_of_healing_wave); RegisterSpellScript(spell_sha_spirit_hunt); RegisterSpellScript(spell_sha_frozen_power); From 2fe33a782dc8defcd753dc0106628f05ab48a193 Mon Sep 17 00:00:00 2001 From: blinkysc <37940565+blinkysc@users.noreply.github.com> Date: Wed, 25 Feb 2026 10:13:05 -0600 Subject: [PATCH 103/150] fix(DB/Spells): Prevent Focused Attacks from proccing on offhand attacks (#24870) Co-authored-by: blinkysc --- data/sql/updates/pending_db_world/rev_1772001104333030701.sql | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 data/sql/updates/pending_db_world/rev_1772001104333030701.sql diff --git a/data/sql/updates/pending_db_world/rev_1772001104333030701.sql b/data/sql/updates/pending_db_world/rev_1772001104333030701.sql new file mode 100644 index 000000000..51eced45e --- /dev/null +++ b/data/sql/updates/pending_db_world/rev_1772001104333030701.sql @@ -0,0 +1,4 @@ +-- Focused Attacks should not proc from offhand attacks (including Fan of Knives offhand) +DELETE FROM `spell_script_names` WHERE `spell_id` = -51634 AND `ScriptName` = 'spell_gen_no_offhand_proc'; +INSERT INTO `spell_script_names` (`spell_id`, `ScriptName`) VALUES +(-51634, 'spell_gen_no_offhand_proc'); From d3a914d90fc5a4fd7368b6e88e1511f008f995ad Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Wed, 25 Feb 2026 16:13:42 +0000 Subject: [PATCH 104/150] chore(DB): import pending files Referenced commit(s): 823bf84a1243598593c27d0f2921919c01ff2e0e --- .../2026_02_25_08.sql} | 1 + .../rev_1772001104333030701.sql => db_world/2026_02_25_09.sql} | 1 + 2 files changed, 2 insertions(+) rename data/sql/updates/{pending_db_world/fix_shaman_t8_electrified_double_proc.sql => db_world/2026_02_25_08.sql} (80%) rename data/sql/updates/{pending_db_world/rev_1772001104333030701.sql => db_world/2026_02_25_09.sql} (87%) diff --git a/data/sql/updates/pending_db_world/fix_shaman_t8_electrified_double_proc.sql b/data/sql/updates/db_world/2026_02_25_08.sql similarity index 80% rename from data/sql/updates/pending_db_world/fix_shaman_t8_electrified_double_proc.sql rename to data/sql/updates/db_world/2026_02_25_08.sql index 68bcbf01a..9ecbd30d7 100644 --- a/data/sql/updates/pending_db_world/fix_shaman_t8_electrified_double_proc.sql +++ b/data/sql/updates/db_world/2026_02_25_08.sql @@ -1,2 +1,3 @@ +-- DB update 2026_02_25_07 -> 2026_02_25_08 -- Remove stale spell_script_names entry for spell_sha_t8_electrified. DELETE FROM `spell_script_names` WHERE `spell_id` = 64928 AND `ScriptName` = 'spell_sha_t8_electrified'; diff --git a/data/sql/updates/pending_db_world/rev_1772001104333030701.sql b/data/sql/updates/db_world/2026_02_25_09.sql similarity index 87% rename from data/sql/updates/pending_db_world/rev_1772001104333030701.sql rename to data/sql/updates/db_world/2026_02_25_09.sql index 51eced45e..149b2ace9 100644 --- a/data/sql/updates/pending_db_world/rev_1772001104333030701.sql +++ b/data/sql/updates/db_world/2026_02_25_09.sql @@ -1,3 +1,4 @@ +-- DB update 2026_02_25_08 -> 2026_02_25_09 -- Focused Attacks should not proc from offhand attacks (including Fan of Knives offhand) DELETE FROM `spell_script_names` WHERE `spell_id` = -51634 AND `ScriptName` = 'spell_gen_no_offhand_proc'; INSERT INTO `spell_script_names` (`spell_id`, `ScriptName`) VALUES From f9fc2027812cafb0d0fd200fa4429698ff1f70f7 Mon Sep 17 00:00:00 2001 From: blinkysc <37940565+blinkysc@users.noreply.github.com> Date: Wed, 25 Feb 2026 10:20:50 -0600 Subject: [PATCH 105/150] fix(Scripts/Spells): Fix Retaliation self-damage and charge loss on activation (#24868) Co-authored-by: blinkysc Co-authored-by: Vincent-Michael --- src/server/scripts/Spells/spell_warrior.cpp | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/src/server/scripts/Spells/spell_warrior.cpp b/src/server/scripts/Spells/spell_warrior.cpp index 421875469..e863c2e3c 100644 --- a/src/server/scripts/Spells/spell_warrior.cpp +++ b/src/server/scripts/Spells/spell_warrior.cpp @@ -47,7 +47,7 @@ enum WarriorSpells SPELL_WARRIOR_JUGGERNAUT_CRIT_BONUS_BUFF = 65156, SPELL_WARRIOR_JUGGERNAUT_CRIT_BONUS_TALENT = 64976, SPELL_WARRIOR_LAST_STAND_TRIGGERED = 12976, - SPELL_WARRIOR_RETALIATION_DAMAGE = 22858, + SPELL_WARRIOR_RETALIATION_DAMAGE = 20240, SPELL_WARRIOR_SLAM = 50783, SPELL_WARRIOR_SUNDER_ARMOR = 58567, SPELL_WARRIOR_SWEEPING_STRIKES_EXTRA_ATTACK_1 = 12723, @@ -884,19 +884,14 @@ class spell_warr_retaliation : public AuraScript bool CheckProc(ProcEventInfo& eventInfo) { - if (!eventInfo.GetActor() || !eventInfo.GetProcTarget()) - { - return false; - } - // check attack comes not from behind and warrior is not stunned - return GetTarget()->isInFront(eventInfo.GetActor(), M_PI) && !GetTarget()->HasUnitState(UNIT_STATE_STUNNED); + return eventInfo.GetActionTarget()->isInFront(eventInfo.GetActor(), float(M_PI)) && !GetTarget()->HasUnitState(UNIT_STATE_STUNNED); } void HandleEffectProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) { PreventDefaultAction(); - GetTarget()->CastSpell(eventInfo.GetProcTarget(), SPELL_WARRIOR_RETALIATION_DAMAGE, true, nullptr, aurEff); + eventInfo.GetActionTarget()->CastSpell(eventInfo.GetActor(), SPELL_WARRIOR_RETALIATION_DAMAGE, true, nullptr, aurEff); } void Register() override From 4d2402a28528228c49cbdb77affd6d4df7263066 Mon Sep 17 00:00:00 2001 From: sudlud Date: Wed, 25 Feb 2026 18:41:59 +0100 Subject: [PATCH 106/150] fix(DB/Gameobject): Sniffed Values for 'Blood of Heroes' spawns (#24855) --- .../rev_1771967006571378200.sql | 265 ++++++++++++++++++ 1 file changed, 265 insertions(+) create mode 100644 data/sql/updates/pending_db_world/rev_1771967006571378200.sql diff --git a/data/sql/updates/pending_db_world/rev_1771967006571378200.sql b/data/sql/updates/pending_db_world/rev_1771967006571378200.sql new file mode 100644 index 000000000..4852a4f43 --- /dev/null +++ b/data/sql/updates/pending_db_world/rev_1771967006571378200.sql @@ -0,0 +1,265 @@ +-- Update gameobject 'Blood of Heroes' with sniffed values +-- updated spawns +DELETE FROM `gameobject` WHERE (`id` IN (176213)) AND (`guid` IN (45512, 45736, 45853, 45892, 45934, 45936, 5276, 5277, 5278, 5279, 5281)); +INSERT INTO `gameobject` (`guid`, `id`, `map`, `zoneId`, `areaId`, `spawnMask`, `phaseMask`, `position_x`, `position_y`, `position_z`, `orientation`, `rotation0`, `rotation1`, `rotation2`, `rotation3`, `spawntimesecs`, `animprogress`, `state`, `ScriptName`, `VerifiedBuild`, `Comment`) VALUES +(45512, 176213, 0, 0, 0, 1, 1, 2412.71240234375, -1721.55712890625, 107.0056533813476562, 2.897245407104492187, 0, 0, 0.99254608154296875, 0.121869951486587524, 7200, 255, 1, "", 49345, NULL), +(45736, 176213, 0, 0, 0, 1, 1, 2192.737060546875, -4479.205078125, 87.65995025634765625, 3.036838293075561523, 0, 0, 0.998628616333007812, 0.052353221923112869, 7200, 255, 1, "", 49345, NULL), +(45853, 176213, 0, 0, 0, 1, 1, 2958.036865234375, -3485.06298828125, 146.221649169921875, 3.281238555908203125, 0, 0, -0.99756336212158203, 0.069766148924827575, 7200, 255, 1, "", 48120, NULL), +(45892, 176213, 0, 0, 0, 1, 1, 2888.376953125, -4086.28564453125, 101.3808364868164062, 4.084071159362792968, 0, 0, -0.8910064697265625, 0.453990638256072998, 7200, 255, 1, "", 50664, NULL), +(45934, 176213, 0, 0, 0, 1, 1, 1873.2691650390625, -3189.559326171875, 128.554168701171875, 0.15707901120185852, 0, 0, 0.078458786010742187, 0.996917366981506347, 7200, 255, 1, "", 50664, NULL), +(45936, 176213, 0, 0, 0, 1, 1, 2115.703125, -4691.1162109375, 74.33621978759765625, 1.151916384696960449, 0, 0, 0.544638633728027343, 0.838670849800109863, 7200, 255, 1, "", 50063, NULL), +(5276, 176213, 0, 0, 0, 1, 1, 1529.1024169921875, -1427.0694580078125, 65.4904937744140625, 3.281238555908203125, 0, 0, -0.99756336212158203, 0.069766148924827575, 7200, 255, 1, "", 48632, NULL), +(5277, 176213, 0, 0, 0, 1, 1, 1705.8743896484375, -4690.13818359375, 48.97421646118164062, 3.194002151489257812, 0, 0, -0.99965667724609375, 0.026201646775007247, 7200, 255, 1, "", 45572, NULL), +(5278, 176213, 0, 0, 0, 1, 1, 1846.7938232421875, -3825.264892578125, 135.515899658203125, 1.832594871520996093, 0, 0, 0.793353080749511718, 0.608761727809906005, 7200, 255, 1, "", 48632, NULL), +(5279, 176213, 0, 0, 0, 1, 1, 1748.163330078125, -4453.13525390625, 74.26271820068359375, 4.223697185516357421, 0, 0, -0.85716724395751953, 0.515038192272186279, 7200, 255, 1, "", 50664, NULL), +(5281, 176213, 0, 0, 0, 1, 1, 1342.5572509765625, -1382.5677490234375, 46.89192962646484375, 2.775068521499633789, 0, 0, 0.983254432678222656, 0.182238012552261352, 7200, 255, 1, "", 45613, NULL); + +-- new spawns +DELETE FROM `gameobject` WHERE (`id` IN (176213)) AND (`guid` IN (9478, 9479, 9480, 9481, 9482, 9483, 9484, 9485, 9486, 9487, 9488, 9489, 9490, 9491, 9492, 9493, 9494, 9495, 9496, 9497, 9498, 9499, 9500, 9501, 9502, 9503, 9504, 9505, 9506, 9507, 9508, 9509, 9510, 9511, 9512, 9513, 9514, 9515, 9516, 9517, 9518, 9519, 9520, 9521, 9522, 9523, 9524, 9525, 9526, 9527, 9528, 9529, 9530, 9531, 9532, 9533, 9534, 9535, 9536, 9537, 9538, 9539, 9540, 9541, 9542, 9543, 9544, 9545, 9546, 9547, 9548, 9549, 9550, 9551, 9552, 9553, 9554, 9555, 9556, 9557, 9558, 9559, 9560, 9561, 9562, 9563, 9564, 9565, 9566, 9567, 9568, 9569, 9570, 9571, 9572, 9573, 9574, 9575, 9576, 9577, 9578, 9579, 9580, 9581, 9582, 9583, 9584, 9585, 9586, 9587)); +INSERT INTO `gameobject` (`guid`, `id`, `map`, `zoneId`, `areaId`, `spawnMask`, `phaseMask`, `position_x`, `position_y`, `position_z`, `orientation`, `rotation0`, `rotation1`, `rotation2`, `rotation3`, `spawntimesecs`, `animprogress`, `state`, `ScriptName`, `VerifiedBuild`, `Comment`) VALUES +(9478, 176213, 0, 0, 0, 1, 1, 1030.57763671875, -2519.484130859375, 59.16263198852539062, 3.368495941162109375, 0, 0, -0.99357128143310546, 0.113208353519439697, 7200, 255, 1, "", 51943, NULL), +(9479, 176213, 0, 0, 0, 1, 1, 1111.51025390625, -2569.175537109375, 59.25194168090820312, 4.799657344818115234, 0, 0, -0.67558956146240234, 0.737277925014495849, 7200, 255, 1, "", 47168, NULL), +(9480, 176213, 0, 0, 0, 1, 1, 1158.575439453125, -2524.986572265625, 60.75162887573242187, 5.6897735595703125, 0, 0, -0.29237174987792968, 0.956304728984832763, 7200, 255, 1, "", 52237, NULL), +(9481, 176213, 0, 0, 0, 1, 1, 1163.8092041015625, -2415.5107421875, 62.01439285278320312, 4.031712055206298828, 0, 0, -0.90258502960205078, 0.430511653423309326, 7200, 255, 1, "", 51943, NULL), +(9482, 176213, 0, 0, 0, 1, 1, 1206.1214599609375, -2316.496337890625, 57.17169189453125, 4.049167633056640625, 0, 0, -0.89879322052001953, 0.438372820615768432, 7200, 255, 1, "", 52237, NULL), +(9483, 176213, 0, 0, 0, 1, 1, 1233.2296142578125, -2373.74462890625, 58.92098617553710937, 4.049167633056640625, 0, 0, -0.89879322052001953, 0.438372820615768432, 7200, 255, 1, "", 49345, NULL), +(9484, 176213, 0, 0, 0, 1, 1, 1272.578125, -1328.576416015625, 61.89749526977539062, 1.431168079376220703, 0, 0, 0.656058311462402343, 0.754710197448730468, 7200, 255, 1, "", 46902, NULL), +(9485, 176213, 0, 0, 0, 1, 1, 1291.939208984375, -2565.14794921875, 111.5222930908203125, 5.654868602752685546, 0, 0, -0.30901622772216796, 0.95105677843093872, 7200, 255, 1, "", 51739, NULL), +(9486, 176213, 0, 0, 0, 1, 1, 1316.46875, -1556.3819580078125, 59.41793441772460937, 3.595378875732421875, 0, 0, -0.97437000274658203, 0.224951311945915222, 7200, 255, 1, "", 46158, NULL), +(9487, 176213, 0, 0, 0, 1, 1, 1347.8597412109375, -1459.9820556640625, 55.78710556030273437, 1.780233979225158691, 0, 0, 0.7771453857421875, 0.629321098327636718, 7200, 255, 1, "", 47720, NULL), +(9488, 176213, 0, 0, 0, 1, 1, 1362.1129150390625, -1630.07470703125, 59.96099090576171875, 2.164205789566040039, 0, 0, 0.882946968078613281, 0.469472706317901611, 7200, 255, 1, "", 45942, NULL), +(9489, 176213, 0, 0, 0, 1, 1, 1374.470458984375, -1289.638916015625, 57.52788543701171875, 1.308995485305786132, 0, 0, 0.608760833740234375, 0.793353796005249023, 7200, 255, 1, "", 46158, NULL), +(9490, 176213, 0, 0, 0, 1, 1, 1410.818115234375, -1443.8800048828125, 55.8153533935546875, 4.956737518310546875, 0, 0, -0.61566066741943359, 0.788011372089385986, 7200, 255, 1, "", 45613, NULL), +(9491, 176213, 0, 0, 0, 1, 1, 1439.4039306640625, -1602.9307861328125, 69.56070709228515625, 4.537858963012695312, 0, 0, -0.76604366302490234, 0.642788589000701904, 7200, 255, 1, "", 47720, NULL), +(9492, 176213, 0, 0, 0, 1, 1, 1460.2784423828125, -2069.739501953125, 51.20478057861328125, 2.687806606292724609, 0, 0, 0.974370002746582031, 0.224951311945915222, 7200, 255, 1, "", 49345, NULL), +(9493, 176213, 0, 0, 0, 1, 1, 1461.8394775390625, -1833.0867919921875, 58.57114028930664062, 4.660029888153076171, 0, 0, -0.72537422180175781, 0.688354730606079101, 7200, 255, 1, "", 45854, NULL), +(9494, 176213, 0, 0, 0, 1, 1, 1465.2467041015625, -1875.5672607421875, 58.71155548095703125, 6.14356088638305664, 0, 0, -0.06975555419921875, 0.997564136981964111, 7200, 255, 1, "", 45942, NULL), +(9495, 176213, 0, 0, 0, 1, 1, 1502.3804931640625, -1486.1605224609375, 57.18505859375, 6.195919513702392578, 0, 0, -0.04361915588378906, 0.999048233032226562, 7200, 255, 1, "", 49345, NULL), +(9496, 176213, 0, 0, 0, 1, 1, 1519.316650390625, -3125.2138671875, 94.45519256591796875, 4.747295856475830078, 0, 0, -0.69465827941894531, 0.719339847564697265, 7200, 255, 1, "", 45942, NULL), +(9497, 176213, 0, 0, 0, 1, 1, 1523.3292236328125, -1864.1004638671875, 59.60967254638671875, 4.206246376037597656, 0, 0, -0.86162853240966796, 0.50753939151763916, 7200, 255, 1, "", 45942, NULL), +(9498, 176213, 0, 0, 0, 1, 1, 1549.2196044921875, -1884.0067138671875, 57.76182174682617187, 0.401424884796142578, 0, 0, 0.199367523193359375, 0.979924798011779785, 7200, 255, 1, "", 46902, NULL), +(9499, 176213, 0, 0, 0, 1, 1, 1581.6258544921875, -3296.41259765625, 92.71665191650390625, 2.513273954391479492, 0, 0, 0.951056480407714843, 0.309017121791839599, 7200, 255, 1, "", 50664, NULL), +(9500, 176213, 0, 0, 0, 1, 1, 1585.51416015625, -1368.17236328125, 61.84386444091796875, 2.792518377304077148, 0, 0, 0.984807014465332031, 0.173652306199073791, 7200, 255, 1, "", 46158, NULL), +(9501, 176213, 0, 0, 0, 1, 1, 1601.953857421875, -3041.421142578125, 78.50331878662109375, 2.460912704467773437, 0, 0, 0.942641258239746093, 0.333807557821273803, 7200, 255, 1, "", 49345, NULL), +(9502, 176213, 0, 0, 0, 1, 1, 1645.173828125, -710.92181396484375, 55.31115341186523437, 0.471238493919372558, 0, 0, 0.233445167541503906, 0.972369968891143798, 7200, 255, 1, "", 45942, NULL), +(9503, 176213, 0, 0, 0, 1, 1, 1645.7691650390625, -1603.4722900390625, 60.60010528564453125, 3.647741317749023437, 0, 0, -0.96814727783203125, 0.250381410121917724, 7200, 255, 1, "", 45435, NULL), +(9504, 176213, 0, 0, 0, 1, 1, 1646.7236328125, -5121.603515625, 77.622894287109375, 3.124123096466064453, 0, 0, 0.99996185302734375, 0.008734640665352344, 7200, 255, 1, "", 51666, NULL), +(9505, 176213, 0, 0, 0, 1, 1, 1647.9044189453125, -4851.15966796875, 83.16530609130859375, 1.221729278564453125, 0, 0, 0.573575973510742187, 0.819152355194091796, 7200, 255, 1, "", 48632, NULL), +(9506, 176213, 0, 0, 0, 1, 1, 1678.4527587890625, -5024.9462890625, 82.38230133056640625, 1.570795774459838867, 0, 0, 0.707106590270996093, 0.707106947898864746, 7200, 255, 1, "", 50664, NULL), +(9507, 176213, 0, 0, 0, 1, 1, 1682.929931640625, -715.29656982421875, 57.69023895263671875, 2.44346022605895996, 0, 0, 0.939692497253417968, 0.34202045202255249, 7200, 255, 1, "", 46158, NULL), +(9508, 176213, 0, 0, 0, 1, 1, 1685.576416015625, -4392.080078125, 85.64618682861328125, 3.961898565292358398, 0, 0, -0.91705989837646484, 0.398749500513076782, 7200, 255, 1, "", 50664, NULL), +(9509, 176213, 0, 0, 0, 1, 1, 1704.4141845703125, -2287.104248046875, 58.94126510620117187, 5.044002056121826171, 0, 0, -0.58070278167724609, 0.814115643501281738, 7200, 255, 1, "", 52237, NULL), +(9510, 176213, 0, 0, 0, 1, 1, 1710.78076171875, -2340.359375, 59.8973541259765625, 1.780233979225158691, 0, 0, 0.7771453857421875, 0.629321098327636718, 7200, 255, 1, "", 50664, NULL), +(9511, 176213, 0, 0, 0, 1, 1, 1715.69091796875, -4480.84130859375, 67.46282958984375, 5.916667938232421875, 0, 0, -0.18223476409912109, 0.98325502872467041, 7200, 255, 1, "", 45435, NULL), +(9512, 176213, 0, 0, 0, 1, 1, 1717.7158203125, -4847.892578125, 92.53662109375, 2.984498262405395507, 0, 0, 0.996916770935058593, 0.078466430306434631, 7200, 255, 1, "", 51666, NULL), +(9513, 176213, 0, 0, 0, 1, 1, 1719.0057373046875, -1334.0836181640625, 65.16336822509765625, 0.645771682262420654, 0, 0, 0.317304611206054687, 0.948323667049407958, 7200, 255, 1, "", 45854, NULL), +(9514, 176213, 0, 0, 0, 1, 1, 1723.9923095703125, -1128.4765625, 61.83336639404296875, 0.837757468223571777, 0, 0, 0.406736373901367187, 0.913545548915863037, 7200, 255, 1, "", 46248, NULL), +(9515, 176213, 0, 0, 0, 1, 1, 1728.4073486328125, -3505.175048828125, 127.25274658203125, 4.398232460021972656, 0, 0, -0.80901622772216796, 0.587786316871643066, 7200, 255, 1, "", 50664, NULL), +(9516, 176213, 0, 0, 0, 1, 1, 1735.6893310546875, -4043.825927734375, 116.1277923583984375, 4.241150379180908203, 0, 0, -0.85264015197753906, 0.522498607635498046, 7200, 255, 1, "", 50664, NULL), +(9517, 176213, 0, 0, 0, 1, 1, 1742.0836181640625, -3792.190185546875, 127.144073486328125, 3.90954136848449707, 0, 0, -0.92718315124511718, 0.37460830807685852, 7200, 255, 1, "", 52237, NULL), +(9518, 176213, 0, 0, 0, 1, 1, 1743.3619384765625, -4438.28955078125, 75.40395355224609375, 4.607671737670898437, 0, 0, -0.74314403533935546, 0.669131457805633544, 7200, 255, 1, "", 48632, NULL), +(9519, 176213, 0, 0, 0, 1, 1, 1767.2125244140625, -3318.948974609375, 102.4638595581054687, 1.884953022003173828, 0, 0, 0.809016227722167968, 0.587786316871643066, 7200, 255, 1, "", 50664, NULL), +(9520, 176213, 0, 0, 0, 1, 1, 1774.233642578125, -4839.80224609375, 91.5816497802734375, 2.530723094940185546, 0, 0, 0.953716278076171875, 0.300707906484603881, 7200, 255, 1, "", 46182, NULL), +(9521, 176213, 0, 0, 0, 1, 1, 1780.121337890625, -5134.4033203125, 74.627838134765625, 0.191985160112380981, 0, 0, 0.095845222473144531, 0.995396256446838378, 7200, 255, 1, "", 50664, NULL), +(9522, 176213, 0, 0, 0, 1, 1, 1805.7340087890625, -4136.9423828125, 94.75803375244140625, 6.056293010711669921, 0, 0, -0.11320304870605468, 0.993571877479553222, 7200, 255, 1, "", 50664, NULL), +(9523, 176213, 0, 0, 0, 1, 1, 1810.6544189453125, -5022.1884765625, 87.799163818359375, 0.977383077144622802, 0, 0, 0.469470977783203125, 0.882947921752929687, 7200, 255, 1, "", 50664, NULL), +(9524, 176213, 0, 0, 0, 1, 1, 1817.9827880859375, -3521.613037109375, 115.2667083740234375, 0.767943859100341796, 0, 0, 0.374606132507324218, 0.927184045314788818, 7200, 255, 1, "", 45942, NULL), +(9525, 176213, 0, 0, 0, 1, 1, 1819.2908935546875, -5033.21875, 88.9647216796875, 1.780233979225158691, 0, 0, 0.7771453857421875, 0.629321098327636718, 7200, 255, 1, "", 52237, NULL), +(9526, 176213, 0, 0, 0, 1, 1, 1823.8018798828125, -2462.234130859375, 70.6959686279296875, 5.881760597229003906, 0, 0, -0.19936752319335937, 0.979924798011779785, 7200, 255, 1, "", 45572, NULL), +(9527, 176213, 0, 0, 0, 1, 1, 1832.8035888671875, -4419.21337890625, 82.59712982177734375, 0.802850961685180664, 0, 0, 0.390730857849121093, 0.920504987239837646, 7200, 255, 1, "", 45770, NULL), +(9528, 176213, 0, 0, 0, 1, 1, 1832.9140625, -4374.04541015625, 98.33393096923828125, 5.759587764739990234, 0, 0, -0.25881862640380859, 0.965925931930541992, 7200, 255, 1, "", 45572, NULL), +(9529, 176213, 0, 0, 0, 1, 1, 1836.9097900390625, -4485.103515625, 74.07691192626953125, 4.834563255310058593, 0, 0, -0.66261959075927734, 0.748956084251403808, 7200, 255, 1, "", 45942, NULL), +(9530, 176213, 0, 0, 0, 1, 1, 1837.0533447265625, -1499.4857177734375, 59.5760040283203125, 3.22885894775390625, 0, 0, -0.99904823303222656, 0.043619260191917419, 7200, 255, 1, "", 48632, NULL), +(9531, 176213, 0, 0, 0, 1, 1, 1843.9600830078125, -3573.161376953125, 113.4916534423828125, 3.43830275535583496, 0, 0, -0.98901557922363281, 0.147811368107795715, 7200, 255, 1, "", 52237, NULL), +(9532, 176213, 0, 0, 0, 1, 1, 1845.767333984375, -1638.98095703125, 59.77754592895507812, 5.096362113952636718, 0, 0, -0.55919265747070312, 0.829037725925445556, 7200, 255, 1, "", 45854, NULL), +(9533, 176213, 0, 0, 0, 1, 1, 1859.8663330078125, -4938.02294921875, 74.93915557861328125, 3.24634718894958496, 0, 0, -0.99862861633300781, 0.052353221923112869, 7200, 255, 1, "", 50664, NULL), +(9534, 176213, 0, 0, 0, 1, 1, 1870.0045166015625, -3988.166259765625, 118.5684280395507812, 0.174532130360603332, 0, 0, 0.087155342102050781, 0.996194720268249511, 7200, 255, 1, "", 49345, NULL), +(9535, 176213, 0, 0, 0, 1, 1, 1876.0130615234375, -4825.20068359375, 110.0122528076171875, 4.066620349884033203, 0, 0, -0.89493370056152343, 0.44619917869567871, 7200, 255, 1, "", 46248, NULL), +(9536, 176213, 0, 0, 0, 1, 1, 1893.234619140625, -3021.161376953125, 75.18372344970703125, 4.136432647705078125, 0, 0, -0.87881660461425781, 0.477159708738327026, 7200, 255, 1, "", 50664, NULL), +(9537, 176213, 0, 0, 0, 1, 1, 1904.0816650390625, -1558.71875, 59.09841537475585937, 0.15707901120185852, 0, 0, 0.078458786010742187, 0.996917366981506347, 7200, 255, 1, "", 54261, NULL), +(9538, 176213, 0, 0, 0, 1, 1, 1909.2803955078125, -3565.246337890625, 115.581207275390625, 5.166176319122314453, 0, 0, -0.52991867065429687, 0.84804844856262207, 7200, 255, 1, "", 50664, NULL), +(9539, 176213, 0, 0, 0, 1, 1, 1945.2076416015625, -4410.9912109375, 73.882720947265625, 1.291541695594787597, 0, 0, 0.60181427001953125, 0.798636078834533691, 7200, 255, 1, "", 50664, NULL), +(9540, 176213, 0, 0, 0, 1, 1, 1954.7691650390625, -4858.17919921875, 105.0598526000976562, 2.879789113998413085, 0, 0, 0.991444587707519531, 0.130528271198272705, 7200, 255, 1, "", 50664, NULL), +(9541, 176213, 0, 0, 0, 1, 1, 1966.1785888671875, -3421.71728515625, 102.4839096069335937, 5.672322273254394531, 0, 0, -0.3007049560546875, 0.953717231750488281, 7200, 255, 1, "", 51739, NULL), +(9542, 176213, 0, 0, 0, 1, 1, 1968.90625, -2337.35498046875, 59.43008804321289062, 2.740161895751953125, 0, 0, 0.979924201965332031, 0.199370384216308593, 7200, 255, 1, "", 51943, NULL), +(9543, 176213, 0, 0, 0, 1, 1, 1974.90234375, -3975.155517578125, 122.6777725219726562, 5.759587764739990234, 0, 0, -0.25881862640380859, 0.965925931930541992, 7200, 255, 1, "", 50664, NULL), +(9544, 176213, 0, 0, 0, 1, 1, 1975.990234375, -3610.39794921875, 123.4244384765625, 1.413715124130249023, 0, 0, 0.649447441101074218, 0.760406434535980224, 7200, 255, 1, "", 50664, NULL), +(9545, 176213, 0, 0, 0, 1, 1, 1980.374755859375, -4824.86279296875, 93.14084625244140625, 0.15707901120185852, 0, 0, 0.078458786010742187, 0.996917366981506347, 7200, 255, 1, "", 45942, NULL), +(9546, 176213, 0, 0, 0, 1, 1, 1984.4683837890625, -3204.544677734375, 90.8921661376953125, 5.777040958404541015, 0, 0, -0.25037956237792968, 0.968147754669189453, 7200, 255, 1, "", 46158, NULL), +(9547, 176213, 0, 0, 0, 1, 1, 1987.42822265625, -4193.2275390625, 11.91735076904296875, 2.111847877502441406, 0, 0, 0.870355606079101562, 0.492423713207244873, 7200, 255, 1, "", 46248, NULL), +(9548, 176213, 0, 0, 0, 1, 1, 1990.5465087890625, -4574.73681640625, 73.62023162841796875, 3.735006093978881835, 0, 0, -0.95630455017089843, 0.292372345924377441, 7200, 255, 1, "", 46182, NULL), +(9549, 176213, 0, 0, 0, 1, 1, 1994.635009765625, -5024.892578125, 74.05865478515625, 5.445427894592285156, 0, 0, -0.40673637390136718, 0.913545548915863037, 7200, 255, 1, "", 45942, NULL), +(9550, 176213, 0, 0, 0, 1, 1, 2006.6827392578125, -3222.05126953125, 87.8593292236328125, 5.375615119934082031, 0, 0, -0.4383707046508789, 0.898794233798980712, 7200, 255, 1, "", 45942, NULL), +(9551, 176213, 0, 0, 0, 1, 1, 2009.135009765625, -4917.5986328125, 75.2410736083984375, 3.211419343948364257, 0, 0, -0.9993906021118164, 0.034906134009361267, 7200, 255, 1, "", 48632, NULL), +(9552, 176213, 0, 0, 0, 1, 1, 2037.09619140625, -3642.14501953125, 129.0787200927734375, 1.675513744354248046, 0, 0, 0.743144035339355468, 0.669131457805633544, 7200, 255, 1, "", 52237, NULL), +(9553, 176213, 0, 0, 0, 1, 1, 2051.180419921875, -3508.745361328125, 118.5655899047851562, 2.67034769058227539, 0, 0, 0.972369194030761718, 0.233448356389999389, 7200, 255, 1, "", 50664, NULL), +(9554, 176213, 0, 0, 0, 1, 1, 2053.743896484375, -4648.36474609375, 83.34580230712890625, 0.767943859100341796, 0, 0, 0.374606132507324218, 0.927184045314788818, 7200, 255, 1, "", 50664, NULL), +(9555, 176213, 0, 0, 0, 1, 1, 2056.85986328125, -4507.48193359375, 75.1407012939453125, 1.32644820213317871, 0, 0, 0.615660667419433593, 0.788011372089385986, 7200, 255, 1, "", 51739, NULL), +(9556, 176213, 0, 0, 0, 1, 1, 2063.5517578125, -5230.8525390625, 83.868865966796875, 5.35816192626953125, 0, 0, -0.446197509765625, 0.894934535026550292, 7200, 255, 1, "", 51943, NULL), +(9557, 176213, 0, 0, 0, 1, 1, 2064.053955078125, -4074.828125, 90.22777557373046875, 5.410521507263183593, 0, 0, -0.42261791229248046, 0.906307935714721679, 7200, 255, 1, "", 50664, NULL), +(9558, 176213, 0, 0, 0, 1, 1, 2084.8515625, -2508.86767578125, 61.53487014770507812, 3.054326534271240234, 0, 0, 0.999048233032226562, 0.043619260191917419, 7200, 255, 1, "", 52237, NULL), +(9559, 176213, 0, 0, 0, 1, 1, 2103.125, -3786.889892578125, 135.1818695068359375, 5.532694816589355468, 0, 0, -0.3665008544921875, 0.93041771650314331, 7200, 255, 1, "", 50664, NULL), +(9560, 176213, 0, 0, 0, 1, 1, 2105.1337890625, -3619.1015625, 154.1257476806640625, 2.111847877502441406, 0, 0, 0.870355606079101562, 0.492423713207244873, 7200, 255, 1, "", 49345, NULL), +(9561, 176213, 0, 0, 0, 1, 1, 2107.758056640625, -3381.773681640625, 128.1119232177734375, 5.096362113952636718, 0, 0, -0.55919265747070312, 0.829037725925445556, 7200, 255, 1, "", 50664, NULL), +(9562, 176213, 0, 0, 0, 1, 1, 2127.1455078125, -2736.7705078125, 75.9159393310546875, 4.607671737670898437, 0, 0, -0.74314403533935546, 0.669131457805633544, 7200, 255, 1, "", 50664, NULL), +(9563, 176213, 0, 0, 0, 1, 1, 2150.30078125, -3978.30810546875, 131.941009521484375, 6.265733242034912109, 0, 0, -0.00872611999511718, 0.999961912631988525, 7200, 255, 1, "", 50664, NULL), +(9564, 176213, 0, 0, 0, 1, 1, 2160.73828125, -5239.59375, 87.311309814453125, 3.141592741012573242, 0, 0, -1, 0, 7200, 255, 1, "", 50664, NULL), +(9565, 176213, 0, 0, 0, 1, 1, 2229.63671875, -2957.7822265625, 110.7782363891601562, 1.274088263511657714, 0, 0, 0.594821929931640625, 0.80385744571685791, 7200, 255, 1, "", 50664, NULL), +(9566, 176213, 0, 0, 0, 1, 1, 2258.832763671875, -5300.38134765625, 82.1673126220703125, 2.740161895751953125, 0, 0, 0.979924201965332031, 0.199370384216308593, 7200, 255, 1, "", 50664, NULL), +(9567, 176213, 0, 0, 0, 1, 1, 2280.908447265625, -5077.03759765625, 60.30791473388671875, 3.45575571060180664, 0, 0, -0.98768806457519531, 0.156436234712600708, 7200, 255, 1, "", 46248, NULL), +(9568, 176213, 0, 0, 0, 1, 1, 2286.678955078125, -4329.5078125, 74.61035919189453125, 0.628316879272460937, 0, 0, 0.309016227722167968, 0.95105677843093872, 7200, 255, 1, "", 50664, NULL), +(9569, 176213, 0, 0, 0, 1, 1, 2318.726318359375, -5221.6796875, 84.40213775634765625, 5.410521507263183593, 0, 0, -0.42261791229248046, 0.906307935714721679, 7200, 255, 1, "", 50664, NULL), +(9570, 176213, 0, 0, 0, 1, 1, 2373.094482421875, -5115.44873046875, 77.14237213134765625, 4.852017402648925781, 0, 0, -0.65605831146240234, 0.754710197448730468, 7200, 255, 1, "", 51739, NULL), +(9571, 176213, 0, 0, 0, 1, 1, 2376.9853515625, -1591.8665771484375, 111.531646728515625, 3.543023586273193359, 0, 0, -0.97992420196533203, 0.199370384216308593, 7200, 255, 1, "", 49345, NULL), +(9572, 176213, 0, 0, 0, 1, 1, 2395.571533203125, -2495.600830078125, 73.28113555908203125, 0.942476630210876464, 0, 0, 0.453989982604980468, 0.891006767749786376, 7200, 255, 1, "", 50664, NULL), +(9573, 176213, 0, 0, 0, 1, 1, 2407.165283203125, -3680.369873046875, 179.73968505859375, 5.148722648620605468, 0, 0, -0.53729915618896484, 0.843391716480255126, 7200, 255, 1, "", 49345, NULL), +(9574, 176213, 0, 0, 0, 1, 1, 2493.391845703125, -2460.99951171875, 73.755462646484375, 1.518436193466186523, 0, 0, 0.6883544921875, 0.725374460220336914, 7200, 255, 1, "", 52237, NULL), +(9575, 176213, 0, 0, 0, 1, 1, 2494.3125, -5134.03466796875, 75.277496337890625, 3.961898565292358398, 0, 0, -0.91705989837646484, 0.398749500513076782, 7200, 255, 1, "", 51739, NULL), +(9576, 176213, 0, 0, 0, 1, 1, 2514.671875, -3735.68359375, 178.346588134765625, 4.468043327331542968, 0, 0, -0.7880105972290039, 0.615661680698394775, 7200, 255, 1, "", 49345, NULL), +(9577, 176213, 0, 0, 0, 1, 1, 2589.39697265625, -1948.304931640625, 86.82270050048828125, 4.9218292236328125, 0, 0, -0.62932014465332031, 0.77714616060256958, 7200, 255, 1, "", 52237, NULL), +(9578, 176213, 0, 0, 0, 1, 1, 2628.4482421875, -4129.61572265625, 82.30001068115234375, 5.742135047912597656, 0, 0, -0.26723766326904296, 0.96363067626953125, 7200, 255, 1, "", 49345, NULL), +(9579, 176213, 0, 0, 0, 1, 1, 2749.6328125, -4022.224365234375, 96.02788543701171875, 2.321286916732788085, 0, 0, 0.917059898376464843, 0.398749500513076782, 7200, 255, 1, "", 52237, NULL), +(9580, 176213, 0, 0, 0, 1, 1, 2818.875732421875, -3605.743408203125, 100.899322509765625, 0.24434557557106018, 0, 0, 0.121869087219238281, 0.9925462007522583, 7200, 255, 1, "", 50664, NULL), +(9581, 176213, 0, 0, 0, 1, 1, 2871.005615234375, -3688.7236328125, 113.7974166870117187, 4.415683269500732421, 0, 0, -0.80385684967041015, 0.594822824001312255, 7200, 255, 1, "", 51666, NULL), +(9582, 176213, 0, 0, 0, 1, 1, 2948.663330078125, -3924.848876953125, 111.3591690063476562, 5.148722648620605468, 0, 0, -0.53729915618896484, 0.843391716480255126, 7200, 255, 1, "", 47720, NULL), +(9583, 176213, 0, 0, 0, 1, 1, 2996.583984375, -3676.655517578125, 134.7823486328125, 2.583080768585205078, 0, 0, 0.961260795593261718, 0.275640487670898437, 7200, 255, 1, "", 47800, NULL), +(9584, 176213, 0, 0, 0, 1, 1, 3111.05322265625, -3684.288330078125, 135.5951690673828125, 3.926995515823364257, 0, 0, -0.92387866973876953, 0.38268551230430603, 7200, 255, 1, "", 48120, NULL), +(9585, 176213, 0, 0, 0, 1, 1, 3112.603515625, -3688.038330078125, 134.407806396484375, 3.194002151489257812, 0, 0, -0.99965667724609375, 0.026201646775007247, 7200, 255, 1, "", 46248, NULL), +(9586, 176213, 0, 0, 0, 1, 1, 3131.486083984375, -3521.912841796875, 154.18524169921875, 5.218535900115966796, 0, 0, -0.507537841796875, 0.861629426479339599, 7200, 255, 1, "", 47800, NULL), +(9587, 176213, 0, 0, 0, 1, 1, 940.89410400390625, -2501.37353515625, 58.77406692504882812, 2.617989301681518554, 0, 0, 0.965925216674804687, 0.258821308612823486, 7200, 255, 1, "", 54261, NULL); + +-- remaining spawns (no sniffed values available) +-- (`guid` IN (45514, 45868, 5280)) + +SET @POOL := 298; + +DELETE FROM `pool_gameobject` WHERE `pool_entry` = @POOL; +INSERT INTO `pool_gameobject` (`guid`, `pool_entry`, `chance`, `description`) VALUES +(5276, @POOL, 0, 'Blood of Heroes'), +(5277, @POOL, 0, 'Blood of Heroes'), +(5278, @POOL, 0, 'Blood of Heroes'), +(5279, @POOL, 0, 'Blood of Heroes'), +(5280, @POOL, 0, 'Blood of Heroes'), +(5281, @POOL, 0, 'Blood of Heroes'), +(9478, @POOL, 0, 'Blood of Heroes'), +(9479, @POOL, 0, 'Blood of Heroes'), +(9480, @POOL, 0, 'Blood of Heroes'), +(9481, @POOL, 0, 'Blood of Heroes'), +(9482, @POOL, 0, 'Blood of Heroes'), +(9483, @POOL, 0, 'Blood of Heroes'), +(9484, @POOL, 0, 'Blood of Heroes'), +(9485, @POOL, 0, 'Blood of Heroes'), +(9486, @POOL, 0, 'Blood of Heroes'), +(9487, @POOL, 0, 'Blood of Heroes'), +(9488, @POOL, 0, 'Blood of Heroes'), +(9489, @POOL, 0, 'Blood of Heroes'), +(9490, @POOL, 0, 'Blood of Heroes'), +(9491, @POOL, 0, 'Blood of Heroes'), +(9492, @POOL, 0, 'Blood of Heroes'), +(9493, @POOL, 0, 'Blood of Heroes'), +(9494, @POOL, 0, 'Blood of Heroes'), +(9495, @POOL, 0, 'Blood of Heroes'), +(9496, @POOL, 0, 'Blood of Heroes'), +(9497, @POOL, 0, 'Blood of Heroes'), +(9498, @POOL, 0, 'Blood of Heroes'), +(9499, @POOL, 0, 'Blood of Heroes'), +(9500, @POOL, 0, 'Blood of Heroes'), +(9501, @POOL, 0, 'Blood of Heroes'), +(9502, @POOL, 0, 'Blood of Heroes'), +(9503, @POOL, 0, 'Blood of Heroes'), +(9504, @POOL, 0, 'Blood of Heroes'), +(9505, @POOL, 0, 'Blood of Heroes'), +(9506, @POOL, 0, 'Blood of Heroes'), +(9507, @POOL, 0, 'Blood of Heroes'), +(9508, @POOL, 0, 'Blood of Heroes'), +(9509, @POOL, 0, 'Blood of Heroes'), +(9510, @POOL, 0, 'Blood of Heroes'), +(9511, @POOL, 0, 'Blood of Heroes'), +(9512, @POOL, 0, 'Blood of Heroes'), +(9513, @POOL, 0, 'Blood of Heroes'), +(9514, @POOL, 0, 'Blood of Heroes'), +(9515, @POOL, 0, 'Blood of Heroes'), +(9516, @POOL, 0, 'Blood of Heroes'), +(9517, @POOL, 0, 'Blood of Heroes'), +(9518, @POOL, 0, 'Blood of Heroes'), +(9519, @POOL, 0, 'Blood of Heroes'), +(9520, @POOL, 0, 'Blood of Heroes'), +(9521, @POOL, 0, 'Blood of Heroes'), +(9522, @POOL, 0, 'Blood of Heroes'), +(9523, @POOL, 0, 'Blood of Heroes'), +(9524, @POOL, 0, 'Blood of Heroes'), +(9525, @POOL, 0, 'Blood of Heroes'), +(9526, @POOL, 0, 'Blood of Heroes'), +(9527, @POOL, 0, 'Blood of Heroes'), +(9528, @POOL, 0, 'Blood of Heroes'), +(9529, @POOL, 0, 'Blood of Heroes'), +(9530, @POOL, 0, 'Blood of Heroes'), +(9531, @POOL, 0, 'Blood of Heroes'), +(9532, @POOL, 0, 'Blood of Heroes'), +(9533, @POOL, 0, 'Blood of Heroes'), +(9534, @POOL, 0, 'Blood of Heroes'), +(9535, @POOL, 0, 'Blood of Heroes'), +(9536, @POOL, 0, 'Blood of Heroes'), +(9537, @POOL, 0, 'Blood of Heroes'), +(9538, @POOL, 0, 'Blood of Heroes'), +(9539, @POOL, 0, 'Blood of Heroes'), +(9540, @POOL, 0, 'Blood of Heroes'), +(9541, @POOL, 0, 'Blood of Heroes'), +(9542, @POOL, 0, 'Blood of Heroes'), +(9543, @POOL, 0, 'Blood of Heroes'), +(9544, @POOL, 0, 'Blood of Heroes'), +(9545, @POOL, 0, 'Blood of Heroes'), +(9546, @POOL, 0, 'Blood of Heroes'), +(9547, @POOL, 0, 'Blood of Heroes'), +(9548, @POOL, 0, 'Blood of Heroes'), +(9549, @POOL, 0, 'Blood of Heroes'), +(9550, @POOL, 0, 'Blood of Heroes'), +(9551, @POOL, 0, 'Blood of Heroes'), +(9552, @POOL, 0, 'Blood of Heroes'), +(9553, @POOL, 0, 'Blood of Heroes'), +(9554, @POOL, 0, 'Blood of Heroes'), +(9555, @POOL, 0, 'Blood of Heroes'), +(9556, @POOL, 0, 'Blood of Heroes'), +(9557, @POOL, 0, 'Blood of Heroes'), +(9558, @POOL, 0, 'Blood of Heroes'), +(9559, @POOL, 0, 'Blood of Heroes'), +(9560, @POOL, 0, 'Blood of Heroes'), +(9561, @POOL, 0, 'Blood of Heroes'), +(9562, @POOL, 0, 'Blood of Heroes'), +(9563, @POOL, 0, 'Blood of Heroes'), +(9564, @POOL, 0, 'Blood of Heroes'), +(9565, @POOL, 0, 'Blood of Heroes'), +(9566, @POOL, 0, 'Blood of Heroes'), +(9567, @POOL, 0, 'Blood of Heroes'), +(9568, @POOL, 0, 'Blood of Heroes'), +(9569, @POOL, 0, 'Blood of Heroes'), +(9570, @POOL, 0, 'Blood of Heroes'), +(9571, @POOL, 0, 'Blood of Heroes'), +(9572, @POOL, 0, 'Blood of Heroes'), +(9573, @POOL, 0, 'Blood of Heroes'), +(9574, @POOL, 0, 'Blood of Heroes'), +(9575, @POOL, 0, 'Blood of Heroes'), +(9576, @POOL, 0, 'Blood of Heroes'), +(9577, @POOL, 0, 'Blood of Heroes'), +(9578, @POOL, 0, 'Blood of Heroes'), +(9579, @POOL, 0, 'Blood of Heroes'), +(9580, @POOL, 0, 'Blood of Heroes'), +(9581, @POOL, 0, 'Blood of Heroes'), +(9582, @POOL, 0, 'Blood of Heroes'), +(9583, @POOL, 0, 'Blood of Heroes'), +(9584, @POOL, 0, 'Blood of Heroes'), +(9585, @POOL, 0, 'Blood of Heroes'), +(9586, @POOL, 0, 'Blood of Heroes'), +(9587, @POOL, 0, 'Blood of Heroes'), +(45512, @POOL, 0, 'Blood of Heroes'), +(45514, @POOL, 0, 'Blood of Heroes'), +(45736, @POOL, 0, 'Blood of Heroes'), +(45853, @POOL, 0, 'Blood of Heroes'), +(45868, @POOL, 0, 'Blood of Heroes'), +(45892, @POOL, 0, 'Blood of Heroes'), +(45934, @POOL, 0, 'Blood of Heroes'), +(45936, @POOL, 0, 'Blood of Heroes'); + +DELETE FROM `pool_template` WHERE `entry` = @POOL; +INSERT INTO `pool_template` (`entry`, `max_limit`, `description`) VALUES +(@POOL, 15, 'Blood of Heroes'); From cfd45f86dc6dd7603b8bd462d3240d9fdeaf5862 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Wed, 25 Feb 2026 17:43:04 +0000 Subject: [PATCH 107/150] chore(DB): import pending files Referenced commit(s): 4d2402a28528228c49cbdb77affd6d4df7263066 --- .../rev_1771967006571378200.sql => db_world/2026_02_25_10.sql} | 1 + 1 file changed, 1 insertion(+) rename data/sql/updates/{pending_db_world/rev_1771967006571378200.sql => db_world/2026_02_25_10.sql} (99%) diff --git a/data/sql/updates/pending_db_world/rev_1771967006571378200.sql b/data/sql/updates/db_world/2026_02_25_10.sql similarity index 99% rename from data/sql/updates/pending_db_world/rev_1771967006571378200.sql rename to data/sql/updates/db_world/2026_02_25_10.sql index 4852a4f43..bba48a9cc 100644 --- a/data/sql/updates/pending_db_world/rev_1771967006571378200.sql +++ b/data/sql/updates/db_world/2026_02_25_10.sql @@ -1,3 +1,4 @@ +-- DB update 2026_02_25_09 -> 2026_02_25_10 -- Update gameobject 'Blood of Heroes' with sniffed values -- updated spawns DELETE FROM `gameobject` WHERE (`id` IN (176213)) AND (`guid` IN (45512, 45736, 45853, 45892, 45934, 45936, 5276, 5277, 5278, 5279, 5281)); From ec7cf77d24dd991c86f6114f965d1ac77813f9ea Mon Sep 17 00:00:00 2001 From: Gultask <100873791+Gultask@users.noreply.github.com> Date: Wed, 25 Feb 2026 14:58:27 -0300 Subject: [PATCH 108/150] fix(DB/GameObject): Set Sniffed Flags to Serpentshrine Console Misc Doodad (#24876) --- data/sql/updates/pending_db_world/rev_1772037778481526100.sql | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 data/sql/updates/pending_db_world/rev_1772037778481526100.sql diff --git a/data/sql/updates/pending_db_world/rev_1772037778481526100.sql b/data/sql/updates/pending_db_world/rev_1772037778481526100.sql new file mode 100644 index 000000000..b2031bb11 --- /dev/null +++ b/data/sql/updates/pending_db_world/rev_1772037778481526100.sql @@ -0,0 +1,2 @@ +-- +UPDATE `gameobject_template_addon` SET `flags` = 16 WHERE (`entry` IN (185115, 185117, 185118)); From d2b60765b17dec74e52cf6afc40f6624298fcc22 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Wed, 25 Feb 2026 17:59:46 +0000 Subject: [PATCH 109/150] chore(DB): import pending files Referenced commit(s): ec7cf77d24dd991c86f6114f965d1ac77813f9ea --- .../rev_1772037778481526100.sql => db_world/2026_02_25_11.sql} | 1 + 1 file changed, 1 insertion(+) rename data/sql/updates/{pending_db_world/rev_1772037778481526100.sql => db_world/2026_02_25_11.sql} (69%) diff --git a/data/sql/updates/pending_db_world/rev_1772037778481526100.sql b/data/sql/updates/db_world/2026_02_25_11.sql similarity index 69% rename from data/sql/updates/pending_db_world/rev_1772037778481526100.sql rename to data/sql/updates/db_world/2026_02_25_11.sql index b2031bb11..fb27fbc81 100644 --- a/data/sql/updates/pending_db_world/rev_1772037778481526100.sql +++ b/data/sql/updates/db_world/2026_02_25_11.sql @@ -1,2 +1,3 @@ +-- DB update 2026_02_25_10 -> 2026_02_25_11 -- UPDATE `gameobject_template_addon` SET `flags` = 16 WHERE (`entry` IN (185115, 185117, 185118)); From 460e2e0cac546f1d9252639e3b10b3477c6a3a9a Mon Sep 17 00:00:00 2001 From: blinkysc <37940565+blinkysc@users.noreply.github.com> Date: Wed, 25 Feb 2026 12:41:42 -0600 Subject: [PATCH 110/150] fix(Core/Spells): Prevent friendly spells from breaking stealth (#24875) --- src/server/game/Spells/Auras/SpellAuras.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/server/game/Spells/Auras/SpellAuras.cpp b/src/server/game/Spells/Auras/SpellAuras.cpp index 9bb9ba9e3..0c908e848 100644 --- a/src/server/game/Spells/Auras/SpellAuras.cpp +++ b/src/server/game/Spells/Auras/SpellAuras.cpp @@ -2184,7 +2184,7 @@ uint8 Aura::GetProcEffectMask(AuraApplication* aurApp, ProcEventInfo& eventInfo, if (m_spellInfo->HasAura(SPELL_AURA_MOD_STEALTH)) { if (SpellInfo const* spellInfo = eventInfo.GetSpellInfo()) - if (spellInfo->IsPositive()) + if (spellInfo->IsPositive() || !eventInfo.GetActor()->IsHostileTo(aurApp->GetTarget())) return 0; } From f370dce7f862fab64f9f4806b7436ece3ce8de6e Mon Sep 17 00:00:00 2001 From: Gultask <100873791+Gultask@users.noreply.github.com> Date: Wed, 25 Feb 2026 18:20:23 -0300 Subject: [PATCH 111/150] fix(DB/Spells): Port Proc Cooldowns from old spell_proc_event table (#24878) --- .../rev_1772046138468225100.sql | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 data/sql/updates/pending_db_world/rev_1772046138468225100.sql diff --git a/data/sql/updates/pending_db_world/rev_1772046138468225100.sql b/data/sql/updates/pending_db_world/rev_1772046138468225100.sql new file mode 100644 index 000000000..8959b5311 --- /dev/null +++ b/data/sql/updates/pending_db_world/rev_1772046138468225100.sql @@ -0,0 +1,17 @@ +-- +DELETE FROM `spell_proc` WHERE `SpellId` IN (21747,24256,27997,28460,33511,33522,38319,40303,43730,43983,45396,45398,45444,55717); +INSERT INTO `spell_proc` (`SpellId`, `SchoolMask`, `SpellFamilyName`, `SpellFamilyMask0`, `SpellFamilyMask1`, `SpellFamilyMask2`, `ProcFlags`, `SpellTypeMask`, `SpellPhaseMask`, `HitMask`, `AttributesMask`, `DisableEffectsMask`, `ProcsPerMinute`, `Chance`, `Cooldown`, `Charges`) VALUES +(21747, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 50000, 0), -- Lawbringer +(24256, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 240000, 0), -- Primal Blessing Trigger DND +(27997, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 50000, 0), -- Spellsurge Trigger +(28460, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 5000, 0), -- Wail of Souls +(33511, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 17000, 0), -- Mana Restore +(33522, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 25000, 0), -- Mana Restore 2 +(38319, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 50000, 0), -- Forgotten Knowledge +(40303, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1000, 0), -- Spell Bomb +(43730, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 8000, 0), -- Stormchops +(43983, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 500, 0), -- Energy Storm +(45396, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 45000, 0), -- Blessed Weapon Coating +(45398, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 45000, 0), -- Righteous Weapon Coating +(45444, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 45000, 0), -- Bonfire's Blessing +(55717, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 5000, 0); -- Wail of Souls From e54c21941ad354d788060227a8e99d2144e31143 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Wed, 25 Feb 2026 21:21:30 +0000 Subject: [PATCH 112/150] chore(DB): import pending files Referenced commit(s): f370dce7f862fab64f9f4806b7436ece3ce8de6e --- .../rev_1772046138468225100.sql => db_world/2026_02_25_12.sql} | 1 + 1 file changed, 1 insertion(+) rename data/sql/updates/{pending_db_world/rev_1772046138468225100.sql => db_world/2026_02_25_12.sql} (97%) diff --git a/data/sql/updates/pending_db_world/rev_1772046138468225100.sql b/data/sql/updates/db_world/2026_02_25_12.sql similarity index 97% rename from data/sql/updates/pending_db_world/rev_1772046138468225100.sql rename to data/sql/updates/db_world/2026_02_25_12.sql index 8959b5311..038e3a13a 100644 --- a/data/sql/updates/pending_db_world/rev_1772046138468225100.sql +++ b/data/sql/updates/db_world/2026_02_25_12.sql @@ -1,3 +1,4 @@ +-- DB update 2026_02_25_11 -> 2026_02_25_12 -- DELETE FROM `spell_proc` WHERE `SpellId` IN (21747,24256,27997,28460,33511,33522,38319,40303,43730,43983,45396,45398,45444,55717); INSERT INTO `spell_proc` (`SpellId`, `SchoolMask`, `SpellFamilyName`, `SpellFamilyMask0`, `SpellFamilyMask1`, `SpellFamilyMask2`, `ProcFlags`, `SpellTypeMask`, `SpellPhaseMask`, `HitMask`, `AttributesMask`, `DisableEffectsMask`, `ProcsPerMinute`, `Chance`, `Cooldown`, `Charges`) VALUES From 0064cdd9ffe5702b8077e7879ec464982d9f3195 Mon Sep 17 00:00:00 2001 From: sudlud Date: Wed, 25 Feb 2026 22:57:00 +0100 Subject: [PATCH 113/150] fix(DB/Gameobject): Sniffed Values for 'unnamed flames' spawns (#24879) --- .../updates/pending_db_world/rev_1772049216964671100.sql | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 data/sql/updates/pending_db_world/rev_1772049216964671100.sql diff --git a/data/sql/updates/pending_db_world/rev_1772049216964671100.sql b/data/sql/updates/pending_db_world/rev_1772049216964671100.sql new file mode 100644 index 000000000..b0af3bf27 --- /dev/null +++ b/data/sql/updates/pending_db_world/rev_1772049216964671100.sql @@ -0,0 +1,7 @@ +-- Update gameobject 'unnamed flames' with sniffed values +-- new spawns +DELETE FROM `gameobject` WHERE (`id` IN (184511, 184512, 184513)) AND (`guid` IN (198, 199, 200)); +INSERT INTO `gameobject` (`guid`, `id`, `map`, `zoneId`, `areaId`, `spawnMask`, `phaseMask`, `position_x`, `position_y`, `position_z`, `orientation`, `rotation0`, `rotation1`, `rotation2`, `rotation3`, `spawntimesecs`, `animprogress`, `state`, `ScriptName`, `VerifiedBuild`, `Comment`) VALUES +(198, 184511, 530, 0, 0, 1, 1, 4014.947021484375, 1910.8055419921875, 247.6915130615234375, 3.710935592651367187, 0, 0, -0.95975399017333984, 0.280842065811157226, 120, 255, 1, "", 45704, NULL), +(199, 184512, 530, 0, 0, 1, 1, 4017.040771484375, 1909.5833740234375, 247.8500213623046875, 5.209121227264404296, 0, 0, -0.51158809661865234, 0.85923081636428833, 120, 255, 1, "", 45704, NULL), +(200, 184513, 530, 0, 0, 1, 1, 4015.8291015625, 1909.7274169921875, 247.7547149658203125, 3.043226480484008789, 0, 0, 0.998790740966796875, 0.049163278192281723, 120, 255, 1, "", 45704, NULL); From 16daeea31600033220570d34be0596066248987e Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Wed, 25 Feb 2026 21:58:06 +0000 Subject: [PATCH 114/150] chore(DB): import pending files Referenced commit(s): 0064cdd9ffe5702b8077e7879ec464982d9f3195 --- .../rev_1772049216964671100.sql => db_world/2026_02_25_13.sql} | 1 + 1 file changed, 1 insertion(+) rename data/sql/updates/{pending_db_world/rev_1772049216964671100.sql => db_world/2026_02_25_13.sql} (95%) diff --git a/data/sql/updates/pending_db_world/rev_1772049216964671100.sql b/data/sql/updates/db_world/2026_02_25_13.sql similarity index 95% rename from data/sql/updates/pending_db_world/rev_1772049216964671100.sql rename to data/sql/updates/db_world/2026_02_25_13.sql index b0af3bf27..e40bea950 100644 --- a/data/sql/updates/pending_db_world/rev_1772049216964671100.sql +++ b/data/sql/updates/db_world/2026_02_25_13.sql @@ -1,3 +1,4 @@ +-- DB update 2026_02_25_12 -> 2026_02_25_13 -- Update gameobject 'unnamed flames' with sniffed values -- new spawns DELETE FROM `gameobject` WHERE (`id` IN (184511, 184512, 184513)) AND (`guid` IN (198, 199, 200)); From fcd7e383c2a5812d7f10f28f67749d014197d65b Mon Sep 17 00:00:00 2001 From: Tereneckla Date: Wed, 25 Feb 2026 22:19:46 +0000 Subject: [PATCH 115/150] fix(DB/Spells): Add scrolls to the str/agi spell group (#24877) --- data/sql/updates/pending_db_world/rev_1772038558469780044.sql | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 data/sql/updates/pending_db_world/rev_1772038558469780044.sql diff --git a/data/sql/updates/pending_db_world/rev_1772038558469780044.sql b/data/sql/updates/pending_db_world/rev_1772038558469780044.sql new file mode 100644 index 000000000..079cd2da1 --- /dev/null +++ b/data/sql/updates/pending_db_world/rev_1772038558469780044.sql @@ -0,0 +1,3 @@ +-- +DELETE FROM `spell_group` WHERE `id` = 1088 AND `spell_id` IN (-1066, -1067); +INSERT INTO `spell_group` (`id`,`spell_id`) VALUES (1088, -1066), (1088, -1067); From 4694cb25704bd7cfff993217c9fbd9867db417ce Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Wed, 25 Feb 2026 22:20:56 +0000 Subject: [PATCH 116/150] chore(DB): import pending files Referenced commit(s): fcd7e383c2a5812d7f10f28f67749d014197d65b --- .../rev_1772038558469780044.sql => db_world/2026_02_25_14.sql} | 1 + 1 file changed, 1 insertion(+) rename data/sql/updates/{pending_db_world/rev_1772038558469780044.sql => db_world/2026_02_25_14.sql} (78%) diff --git a/data/sql/updates/pending_db_world/rev_1772038558469780044.sql b/data/sql/updates/db_world/2026_02_25_14.sql similarity index 78% rename from data/sql/updates/pending_db_world/rev_1772038558469780044.sql rename to data/sql/updates/db_world/2026_02_25_14.sql index 079cd2da1..27a19e0f6 100644 --- a/data/sql/updates/pending_db_world/rev_1772038558469780044.sql +++ b/data/sql/updates/db_world/2026_02_25_14.sql @@ -1,3 +1,4 @@ +-- DB update 2026_02_25_13 -> 2026_02_25_14 -- DELETE FROM `spell_group` WHERE `id` = 1088 AND `spell_id` IN (-1066, -1067); INSERT INTO `spell_group` (`id`,`spell_id`) VALUES (1088, -1066), (1088, -1067); From 0d7baa00f6661143e6aaedc2b68715ef23208c54 Mon Sep 17 00:00:00 2001 From: Gultask <100873791+Gultask@users.noreply.github.com> Date: Wed, 25 Feb 2026 19:43:52 -0300 Subject: [PATCH 117/150] fix(DB/Loot): Remove ilvl 146 Weapons in the 72-74 Level Range that were never supposed to drop in original WotLK (#24885) --- .../rev_1772058834607248000.sql | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 data/sql/updates/pending_db_world/rev_1772058834607248000.sql diff --git a/data/sql/updates/pending_db_world/rev_1772058834607248000.sql b/data/sql/updates/pending_db_world/rev_1772058834607248000.sql new file mode 100644 index 000000000..a38ec606c --- /dev/null +++ b/data/sql/updates/pending_db_world/rev_1772058834607248000.sql @@ -0,0 +1,20 @@ +-- +DELETE FROM `reference_loot_template` WHERE `Entry` = 1227274 AND `Item` IN ( +36533, -- Adorned Broadsword +36603, -- Archaic Longspear +36575, -- Dragonflayer Hatchet +36505, -- Frosted Steel Mallet +36631, -- Horned Crossbow +36687, -- Illuminated Scepter +36547, -- Jester's Stick +36519, -- Moonlit Katana +36701, -- Pine Needle Staff +36715, -- Runed Shuriken, 146 +36589, -- Segmenting Broadaxe +36491, -- Serrated Maul +36659, -- Shivery Wand +36645, -- Tuskarr Boomstick +36477, -- Twin-Edged Stiletto +36673, -- Wise Dagger +36617 -- Yielding Bow +); From 46ceba3d002f5dce9413e88a4ae2e437bf2524bb Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Wed, 25 Feb 2026 22:49:18 +0000 Subject: [PATCH 118/150] chore(DB): import pending files Referenced commit(s): 0d7baa00f6661143e6aaedc2b68715ef23208c54 --- .../rev_1772058834607248000.sql => db_world/2026_02_25_15.sql} | 1 + 1 file changed, 1 insertion(+) rename data/sql/updates/{pending_db_world/rev_1772058834607248000.sql => db_world/2026_02_25_15.sql} (92%) diff --git a/data/sql/updates/pending_db_world/rev_1772058834607248000.sql b/data/sql/updates/db_world/2026_02_25_15.sql similarity index 92% rename from data/sql/updates/pending_db_world/rev_1772058834607248000.sql rename to data/sql/updates/db_world/2026_02_25_15.sql index a38ec606c..9cd997993 100644 --- a/data/sql/updates/pending_db_world/rev_1772058834607248000.sql +++ b/data/sql/updates/db_world/2026_02_25_15.sql @@ -1,3 +1,4 @@ +-- DB update 2026_02_25_14 -> 2026_02_25_15 -- DELETE FROM `reference_loot_template` WHERE `Entry` = 1227274 AND `Item` IN ( 36533, -- Adorned Broadsword From 2ff0ec82112510dc5c892a9d0d807938572ec0b3 Mon Sep 17 00:00:00 2001 From: sudlud Date: Thu, 26 Feb 2026 00:09:34 +0100 Subject: [PATCH 119/150] fix(DB/Gameobject): Sniffed Values for 'Doodad_WoodSign%' spawns (#24882) --- .../rev_1772057308668452700.sql | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 data/sql/updates/pending_db_world/rev_1772057308668452700.sql diff --git a/data/sql/updates/pending_db_world/rev_1772057308668452700.sql b/data/sql/updates/pending_db_world/rev_1772057308668452700.sql new file mode 100644 index 000000000..9fea76a40 --- /dev/null +++ b/data/sql/updates/pending_db_world/rev_1772057308668452700.sql @@ -0,0 +1,22 @@ +-- Update gameobject 'Doodad_WoodSign%' with sniffed values +-- updated spawns +DELETE FROM `gameobject` WHERE (`id` IN (175657, 175656)) AND (`guid` IN (45623, 45624)); +INSERT INTO `gameobject` (`guid`, `id`, `map`, `zoneId`, `areaId`, `spawnMask`, `phaseMask`, `position_x`, `position_y`, `position_z`, `orientation`, `rotation0`, `rotation1`, `rotation2`, `rotation3`, `spawntimesecs`, `animprogress`, `state`, `ScriptName`, `VerifiedBuild`, `Comment`) VALUES +(45623, 175657, 0, 0, 0, 1, 1, 3447.166015625, -3369.943603515625, 140.924652099609375, 4.7944183349609375, -0.11731481552124023, 0.128026962280273437, -0.66532611846923828, 0.726076781749725341, 120, 255, 1, "", 46248, NULL), +(45624, 175656, 0, 0, 0, 1, 1, 3446.5439453125, -3370.093017578125, 140.956390380859375, 1.658061861991882324, 0, 0, 0.737277030944824218, 0.67559051513671875, 120, 255, 1, "", 46248, NULL); + +-- new spawns +DELETE FROM `gameobject` WHERE (`id` IN (175647, 175648, 175649, 175650, 175651, 175652, 175653, 175656, 175657, 191103, 191104, 191105)) AND (`guid` IN (1827, 1828, 1829, 1830, 1831, 1832, 1833, 1834, 1835, 1836, 1837, 1838)); +INSERT INTO `gameobject` (`guid`, `id`, `map`, `zoneId`, `areaId`, `spawnMask`, `phaseMask`, `position_x`, `position_y`, `position_z`, `orientation`, `rotation0`, `rotation1`, `rotation2`, `rotation3`, `spawntimesecs`, `animprogress`, `state`, `ScriptName`, `VerifiedBuild`, `Comment`) VALUES +(1827, 175647, 0, 0, 0, 1, 1, 3524.133544921875, -3377.8134765625, 133.013336181640625, 2.967044830322265625, -0.00380182266235351, -0.04345226287841796, 0.995245933532714843, 0.087080210447311401, 120, 255, 1, "", 51943, NULL), +(1828, 175648, 0, 0, 0, 1, 1, 3524.405029296875, -3376.470458984375, 132.1711578369140625, 2.967034816741943359, -0.01886367797851562, -0.21561527252197265, 0.9725799560546875, 0.085102535784244537, 120, 255, 1, "", 51943, NULL), +(1829, 175649, 0, 0, 0, 1, 1, 3524.434326171875, -3376.182373046875, 133.055755615234375, 6.108653545379638671, 0, 0, -0.08715534210205078, 0.996194720268249511, 120, 255, 1, "", 51943, NULL), +(1830, 175650, 0, 0, 0, 1, 1, 3523.578369140625, -3377.0380859375, 132.5085906982421875, 1.396262884140014648, -0.03341388702392578, -0.02803707122802734, 0.642175674438476562, 0.765315532684326171, 120, 255, 1, "", 51943, NULL), +(1831, 175651, 0, 0, 0, 1, 1, 3558.121337890625, -3320.4375, 130.2952880859375, 4.450591087341308593, 0.07945871353149414, -0.10355281829833984, -0.78656578063964843, 0.603554010391235351, 120, 255, 1, "", 51943, NULL), +(1832, 175652, 0, 0, 0, 1, 1, 3555.34716796875, -3319.654541015625, 129.94805908203125, 1.308995485305786132, 0, 0, 0.608760833740234375, 0.793353796005249023, 120, 255, 1, "", 51943, NULL), +(1833, 175653, 0, 0, 0, 1, 1, 3555.99267578125, -3321.162109375, 129.500030517578125, 2.879780769348144531, 0.005692958831787109, 0.043245315551757812, 0.990500450134277343, 0.130408123135566711, 120, 255, 1, "", 51943, NULL), +(1834, 175656, 533, 0, 0, 3, 1, 3446.5439453125, -3370.093017578125, 140.9564361572265625, 1.658061861991882324, 0, 0, 0.737277030944824218, 0.67559051513671875, 7200, 255, 1, "", 45942, NULL), +(1835, 175657, 533, 0, 0, 3, 1, 3447.166015625, -3369.943603515625, 140.9246978759765625, 4.7944183349609375, -0.11731481552124023, 0.128026962280273437, -0.66532611846923828, 0.726076781749725341, 7200, 255, 1, "", 45942, NULL), +(1836, 191103, 595, 0, 0, 3, 1, 2317.92431640625, 1055.965087890625, 138.809112548828125, 0.261798620223999023, 0.043245792388916015, 0.005692481994628906, 0.130401611328125, 0.990501284599304199, 7200, 255, 1, "", 46248, NULL), +(1837, 191104, 595, 0, 0, 3, 1, 2319.237060546875, 1054.982177734375, 139.2571563720703125, 4.97418975830078125, 0, 0, -0.60876083374023437, 0.793353796005249023, 7200, 255, 1, "", 46248, NULL), +(1838, 191105, 595, 0, 0, 3, 1, 2316.443115234375, 1054.273193359375, 139.6043853759765625, 1.83259439468383789, 0.07945871353149414, 0.103552818298339843, 0.786565780639648437, 0.603554010391235351, 7200, 255, 1, "", 46248, NULL); From aafe5f8b2f1b0cb94b4bd3df7d6ab9bb4e29152f Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Wed, 25 Feb 2026 23:33:16 +0000 Subject: [PATCH 120/150] chore(DB): import pending files Referenced commit(s): 46ceba3d002f5dce9413e88a4ae2e437bf2524bb --- .../rev_1772057308668452700.sql => db_world/2026_02_25_16.sql} | 1 + 1 file changed, 1 insertion(+) rename data/sql/updates/{pending_db_world/rev_1772057308668452700.sql => db_world/2026_02_25_16.sql} (98%) diff --git a/data/sql/updates/pending_db_world/rev_1772057308668452700.sql b/data/sql/updates/db_world/2026_02_25_16.sql similarity index 98% rename from data/sql/updates/pending_db_world/rev_1772057308668452700.sql rename to data/sql/updates/db_world/2026_02_25_16.sql index 9fea76a40..65d115f1b 100644 --- a/data/sql/updates/pending_db_world/rev_1772057308668452700.sql +++ b/data/sql/updates/db_world/2026_02_25_16.sql @@ -1,3 +1,4 @@ +-- DB update 2026_02_25_15 -> 2026_02_25_16 -- Update gameobject 'Doodad_WoodSign%' with sniffed values -- updated spawns DELETE FROM `gameobject` WHERE (`id` IN (175657, 175656)) AND (`guid` IN (45623, 45624)); From 00550945dfb01ba1419c23967d44ed7cbd07b9b5 Mon Sep 17 00:00:00 2001 From: sudlud Date: Thu, 26 Feb 2026 03:27:00 +0100 Subject: [PATCH 121/150] fix(DB/Gameobject): Sniffed Values for 'Sitting Skeleton 03' spawns (#24883) --- .../rev_1772058465656331100.sql | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) create mode 100644 data/sql/updates/pending_db_world/rev_1772058465656331100.sql diff --git a/data/sql/updates/pending_db_world/rev_1772058465656331100.sql b/data/sql/updates/pending_db_world/rev_1772058465656331100.sql new file mode 100644 index 000000000..d9d1811a0 --- /dev/null +++ b/data/sql/updates/pending_db_world/rev_1772058465656331100.sql @@ -0,0 +1,23 @@ +-- Update gameobject 'Sitting Skeleton 03' with sniffed values +-- new spawns +DELETE FROM `gameobject` WHERE (`id` IN (185436)) AND (`guid` IN (2058, 2059, 2060, 2061, 2062, 2063, 2064, 2065, 2066, 2067, 2068, 2069, 2070, 2071, 2072)); +INSERT INTO `gameobject` (`guid`, `id`, `map`, `zoneId`, `areaId`, `spawnMask`, `phaseMask`, `position_x`, `position_y`, `position_z`, `orientation`, `rotation0`, `rotation1`, `rotation2`, `rotation3`, `spawntimesecs`, `animprogress`, `state`, `ScriptName`, `VerifiedBuild`, `Comment`) VALUES +(2058, 185436, 530, 0, 0, 1, 1, -3907.8671875, 2093.739013671875, 95.62811279296875, 3.543023586273193359, 0, 0, -0.97992420196533203, 0.199370384216308593, 120, 255, 1, "", 45942, NULL), +(2059, 185436, 530, 0, 0, 1, 1, -564.967041015625, 4154.21337890625, 68.07680511474609375, 3.78736734390258789, 0, 0, -0.94832324981689453, 0.317305892705917358, 120, 255, 1, "", 45942, NULL), +(2060, 185436, 530, 0, 0, 1, 1, -574.1278076171875, 4140.8173828125, 68.09943389892578125, 2.583080768585205078, 0, 0, 0.961260795593261718, 0.275640487670898437, 120, 255, 1, "", 45942, NULL), +(2061, 185436, 530, 0, 0, 1, 1, -589.0184326171875, 4162.07666015625, 66.71608734130859375, 2.076939344406127929, 0, 0, 0.861628532409667968, 0.50753939151763916, 120, 255, 1, "", 45942, NULL), +(2062, 185436, 530, 0, 0, 1, 1, -600.029296875, 4182.40869140625, 65.08914947509765625, 5.131268978118896484, 0, 0, -0.54463863372802734, 0.838670849800109863, 120, 255, 1, "", 45942, NULL), +(2063, 185436, 530, 0, 0, 1, 1, -603.2060546875, 4110.416015625, 89.74161529541015625, 3.351046562194824218, 0, 0, -0.99452114105224609, 0.104535527527332305, 120, 255, 1, "", 45942, NULL), +(2064, 185436, 530, 0, 0, 1, 1, -705.45172119140625, 4170.107421875, 58.10678482055664062, 2.042035102844238281, 0, 0, 0.852640151977539062, 0.522498607635498046, 120, 255, 1, "", 45942, NULL), +(2065, 185436, 530, 0, 0, 1, 1, 2020.396484375, 6883.37109375, 179.0448760986328125, 4.223697185516357421, 0, 0, -0.85716724395751953, 0.515038192272186279, 120, 255, 1, "", 45942, NULL), +(2066, 185436, 530, 0, 0, 1, 1, 2020.7047119140625, 6866.521484375, 175.3189239501953125, 4.817109584808349609, 0, 0, -0.66913032531738281, 0.74314504861831665, 120, 255, 1, "", 45942, NULL), +(2067, 185436, 530, 0, 0, 1, 1, 2086.187744140625, 6900.2080078125, 192.64654541015625, 5.532694816589355468, 0, 0, -0.3665008544921875, 0.93041771650314331, 120, 255, 1, "", 45942, NULL), +(2068, 185436, 530, 0, 0, 1, 1, 2093.576904296875, 6905.708984375, 184.14654541015625, 0.820303261280059814, 0, 0, 0.398748397827148437, 0.917060375213623046, 120, 255, 1, "", 45942, NULL), +(2069, 185436, 530, 0, 0, 1, 1, 2095.02099609375, 6914.87158203125, 184.14654541015625, 4.852017402648925781, 0, 0, -0.65605831146240234, 0.754710197448730468, 120, 255, 1, "", 45942, NULL), +(2070, 185436, 530, 0, 0, 1, 1, 2332.642822265625, 6017.2548828125, 143.2427978515625, 2.460912704467773437, 0, 0, 0.942641258239746093, 0.333807557821273803, 120, 255, 1, "", 45942, NULL), +(2071, 185436, 530, 0, 0, 1, 1, 236.929473876953125, 4335.20556640625, 119.2413330078125, 2.164205789566040039, 0, 0, 0.882946968078613281, 0.469472706317901611, 120, 255, 1, "", 45942, NULL), +(2072, 185436, 530, 0, 0, 1, 1, 2378.47021484375, 5942.01025390625, 152.7965545654296875, 5.811946868896484375, 0, 0, -0.2334451675415039, 0.972369968891143798, 120, 255, 1, "", 45942, NULL); + +-- enable all spawns for eventEntry 12 +DELETE FROM `game_event_gameobject` WHERE (`eventEntry` = 12) AND (`guid` IN (SELECT `guid` FROM `gameobject` WHERE `id` IN (185436))); +INSERT INTO `game_event_gameobject` (SELECT 12, `guid` FROM `gameobject` WHERE `id` IN (185436)); From 905a274895c1c6497924a6241c88ab6647cca197 Mon Sep 17 00:00:00 2001 From: sudlud Date: Thu, 26 Feb 2026 03:27:37 +0100 Subject: [PATCH 122/150] fix(DB/Gameobject): Sniffed Values for 'Huge Sitting Skeleton 02' spawns (#24884) --- .../rev_1772058806703413600.sql | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 data/sql/updates/pending_db_world/rev_1772058806703413600.sql diff --git a/data/sql/updates/pending_db_world/rev_1772058806703413600.sql b/data/sql/updates/pending_db_world/rev_1772058806703413600.sql new file mode 100644 index 000000000..4e76c7076 --- /dev/null +++ b/data/sql/updates/pending_db_world/rev_1772058806703413600.sql @@ -0,0 +1,17 @@ +-- Update gameobject 'Huge Sitting Skeleton 02' with sniffed values +-- new spawns +DELETE FROM `gameobject` WHERE (`id` IN (185457)) AND (`guid` IN (1145, 1146, 1147, 1148, 1149, 1150, 1151, 1152, 1153)); +INSERT INTO `gameobject` (`guid`, `id`, `map`, `zoneId`, `areaId`, `spawnMask`, `phaseMask`, `position_x`, `position_y`, `position_z`, `orientation`, `rotation0`, `rotation1`, `rotation2`, `rotation3`, `spawntimesecs`, `animprogress`, `state`, `ScriptName`, `VerifiedBuild`, `Comment`) VALUES +(1145, 185457, 530, 0, 0, 1, 1, -1938.5836181640625, 5561.431640625, -12.428135871887207, 0.471238493919372558, 0, 0, 0.233445167541503906, 0.972369968891143798, 120, 255, 1, "", 45942, NULL), +(1146, 185457, 530, 0, 0, 1, 1, -3905.52294921875, 2069.8984375, 94.74691009521484375, 5.969027042388916015, 0, 0, -0.1564340591430664, 0.987688362598419189, 120, 255, 1, "", 46158, NULL), +(1147, 185457, 530, 0, 0, 1, 1, -3953.84423828125, 2105.051513671875, 101.2719573974609375, 1.169368624687194824, 0, 0, 0.551936149597167968, 0.833886384963989257, 120, 255, 1, "", 45942, NULL), +(1148, 185457, 530, 0, 0, 1, 1, 1865.3406982421875, 5589.482421875, 257.4517822265625, 2.146752834320068359, 0, 0, 0.878816604614257812, 0.477159708738327026, 120, 255, 1, "", 45942, NULL), +(1149, 185457, 530, 0, 0, 1, 1, 1964.1754150390625, 5582.79541015625, 260.20611572265625, 6.09120035171508789, 0, 0, -0.09584522247314453, 0.995396256446838378, 120, 255, 1, "", 45942, NULL), +(1150, 185457, 530, 0, 0, 1, 1, 2133.226318359375, 4733.923828125, 152.619537353515625, 6.14356088638305664, 0, 0, -0.06975555419921875, 0.997564136981964111, 120, 255, 1, "", 45942, NULL), +(1151, 185457, 530, 0, 0, 1, 1, 2242.098876953125, 4794.908203125, 156.0864410400390625, 2.967041015625, 0, 0, 0.996193885803222656, 0.087165042757987976, 120, 255, 1, "", 45942, NULL), +(1152, 185457, 530, 0, 0, 1, 1, 2382.612548828125, 6030.99560546875, 141.7354278564453125, 6.12610626220703125, 0, 0, -0.07845878601074218, 0.996917366981506347, 120, 255, 1, "", 45942, NULL), +(1153, 185457, 530, 0, 0, 1, 1, 2462.454345703125, 5970.259765625, 154.7728729248046875, 3.926995515823364257, 0, 0, -0.92387866973876953, 0.38268551230430603, 120, 255, 1, "", 45942, NULL); + +-- enable all spawns for eventEntry 12 +DELETE FROM `game_event_gameobject` WHERE (`eventEntry` = 12) AND (`guid` IN (SELECT `guid` FROM `gameobject` WHERE `id` IN (185457))); +INSERT INTO `game_event_gameobject` (SELECT 12, `guid` FROM `gameobject` WHERE `id` IN (185457)); From 00a5b78d72ba17dadfa953250d6e07bb3dc60918 Mon Sep 17 00:00:00 2001 From: sudlud Date: Thu, 26 Feb 2026 03:27:54 +0100 Subject: [PATCH 123/150] fix(DB/Gameobject): Sniffed Values for 'Huge Laying Skeleton 02' spawns (#24886) --- .../pending_db_world/rev_1772059110373151900.sql | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 data/sql/updates/pending_db_world/rev_1772059110373151900.sql diff --git a/data/sql/updates/pending_db_world/rev_1772059110373151900.sql b/data/sql/updates/pending_db_world/rev_1772059110373151900.sql new file mode 100644 index 000000000..dc04ea390 --- /dev/null +++ b/data/sql/updates/pending_db_world/rev_1772059110373151900.sql @@ -0,0 +1,12 @@ +-- Update gameobject 'Huge Laying Skeleton 02' with sniffed values +-- new spawns +DELETE FROM `gameobject` WHERE (`id` IN (185458)) AND (`guid` IN (222, 223, 224, 225)); +INSERT INTO `gameobject` (`guid`, `id`, `map`, `zoneId`, `areaId`, `spawnMask`, `phaseMask`, `position_x`, `position_y`, `position_z`, `orientation`, `rotation0`, `rotation1`, `rotation2`, `rotation3`, `spawntimesecs`, `animprogress`, `state`, `ScriptName`, `VerifiedBuild`, `Comment`) VALUES +(222, 185458, 530, 0, 0, 1, 1, -3972.2392578125, 2224.816650390625, 102.3404464721679687, 0.593410074710845947, 0, 0, 0.292370796203613281, 0.95630502700805664, 120, 255, 1, "", 45942, NULL), +(223, 185458, 530, 0, 0, 1, 1, -3990.3056640625, 2148.642333984375, 104.2225723266601562, 0.139624491333961486, 0, 0, 0.06975555419921875, 0.997564136981964111, 120, 255, 1, "", 45942, NULL), +(224, 185458, 530, 0, 0, 1, 1, 2289.8935546875, 5987.240234375, 142.3500518798828125, 2.042035102844238281, 0, 0, 0.852640151977539062, 0.522498607635498046, 120, 255, 1, "", 45942, NULL), +(225, 185458, 530, 0, 0, 1, 1, 2362.826416015625, 5975.78369140625, 152.4012603759765625, 0.733038187026977539, 0, 0, 0.358367919921875, 0.933580458164215087, 120, 255, 1, "", 45942, NULL); + +-- enable all spawns for eventEntry 12 +DELETE FROM `game_event_gameobject` WHERE (`eventEntry` = 12) AND (`guid` IN (SELECT `guid` FROM `gameobject` WHERE `id` IN (185458))); +INSERT INTO `game_event_gameobject` (SELECT 12, `guid` FROM `gameobject` WHERE `id` IN (185458)); From 450e0c02921edb193c1212cbb7bd662386475c1e Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Thu, 26 Feb 2026 02:28:04 +0000 Subject: [PATCH 124/150] chore(DB): import pending files Referenced commit(s): 00550945dfb01ba1419c23967d44ed7cbd07b9b5 --- .../rev_1772058465656331100.sql => db_world/2026_02_26_00.sql} | 1 + .../rev_1772058806703413600.sql => db_world/2026_02_26_01.sql} | 1 + .../rev_1772059110373151900.sql => db_world/2026_02_26_02.sql} | 1 + 3 files changed, 3 insertions(+) rename data/sql/updates/{pending_db_world/rev_1772058465656331100.sql => db_world/2026_02_26_00.sql} (98%) rename data/sql/updates/{pending_db_world/rev_1772058806703413600.sql => db_world/2026_02_26_01.sql} (98%) rename data/sql/updates/{pending_db_world/rev_1772059110373151900.sql => db_world/2026_02_26_02.sql} (97%) diff --git a/data/sql/updates/pending_db_world/rev_1772058465656331100.sql b/data/sql/updates/db_world/2026_02_26_00.sql similarity index 98% rename from data/sql/updates/pending_db_world/rev_1772058465656331100.sql rename to data/sql/updates/db_world/2026_02_26_00.sql index d9d1811a0..00fffedab 100644 --- a/data/sql/updates/pending_db_world/rev_1772058465656331100.sql +++ b/data/sql/updates/db_world/2026_02_26_00.sql @@ -1,3 +1,4 @@ +-- DB update 2026_02_25_16 -> 2026_02_26_00 -- Update gameobject 'Sitting Skeleton 03' with sniffed values -- new spawns DELETE FROM `gameobject` WHERE (`id` IN (185436)) AND (`guid` IN (2058, 2059, 2060, 2061, 2062, 2063, 2064, 2065, 2066, 2067, 2068, 2069, 2070, 2071, 2072)); diff --git a/data/sql/updates/pending_db_world/rev_1772058806703413600.sql b/data/sql/updates/db_world/2026_02_26_01.sql similarity index 98% rename from data/sql/updates/pending_db_world/rev_1772058806703413600.sql rename to data/sql/updates/db_world/2026_02_26_01.sql index 4e76c7076..b6009e103 100644 --- a/data/sql/updates/pending_db_world/rev_1772058806703413600.sql +++ b/data/sql/updates/db_world/2026_02_26_01.sql @@ -1,3 +1,4 @@ +-- DB update 2026_02_26_00 -> 2026_02_26_01 -- Update gameobject 'Huge Sitting Skeleton 02' with sniffed values -- new spawns DELETE FROM `gameobject` WHERE (`id` IN (185457)) AND (`guid` IN (1145, 1146, 1147, 1148, 1149, 1150, 1151, 1152, 1153)); diff --git a/data/sql/updates/pending_db_world/rev_1772059110373151900.sql b/data/sql/updates/db_world/2026_02_26_02.sql similarity index 97% rename from data/sql/updates/pending_db_world/rev_1772059110373151900.sql rename to data/sql/updates/db_world/2026_02_26_02.sql index dc04ea390..32dfbd59f 100644 --- a/data/sql/updates/pending_db_world/rev_1772059110373151900.sql +++ b/data/sql/updates/db_world/2026_02_26_02.sql @@ -1,3 +1,4 @@ +-- DB update 2026_02_26_01 -> 2026_02_26_02 -- Update gameobject 'Huge Laying Skeleton 02' with sniffed values -- new spawns DELETE FROM `gameobject` WHERE (`id` IN (185458)) AND (`guid` IN (222, 223, 224, 225)); From 5cf9ae11a58e27352e07c88c6039521938934697 Mon Sep 17 00:00:00 2001 From: Andrew <47818697+Nyeriah@users.noreply.github.com> Date: Thu, 26 Feb 2026 05:49:33 -0300 Subject: [PATCH 125/150] feat(Core/Commands): Add .spellinfo command with subcommands (#24867) Co-authored-by: Copilot <198982749+Copilot@users.noreply.github.com> --- .../rev_1771989601546823271.sql | 8 + .../scripts/Commands/cs_script_loader.cpp | 2 + src/server/scripts/Commands/cs_spellinfo.cpp | 988 ++++++++++++++++++ 3 files changed, 998 insertions(+) create mode 100644 data/sql/updates/pending_db_world/rev_1771989601546823271.sql create mode 100644 src/server/scripts/Commands/cs_spellinfo.cpp diff --git a/data/sql/updates/pending_db_world/rev_1771989601546823271.sql b/data/sql/updates/pending_db_world/rev_1771989601546823271.sql new file mode 100644 index 000000000..16cc99283 --- /dev/null +++ b/data/sql/updates/pending_db_world/rev_1771989601546823271.sql @@ -0,0 +1,8 @@ +-- +DELETE FROM `command` WHERE `name` IN ('spellinfo', 'spellinfo attributes', 'spellinfo effects', 'spellinfo targets', 'spellinfo all'); +INSERT INTO `command` (`name`, `security`, `help`) VALUES +('spellinfo', 2, 'Syntax: .spellinfo $subcommand\n\nType .spellinfo to see a list of subcommands or .help spellinfo $subcommand to see info on subcommands.'), +('spellinfo attributes', 2, 'Syntax: .spellinfo attributes #spellid\n\nDisplays basic info and attribute flags for spell #spellid including SpellAttr0-7, custom attributes, stances, dispel type and mechanic.'), +('spellinfo effects', 2, 'Syntax: .spellinfo effects #spellid\n\nDisplays effect data for spell #spellid including effect type, aura type, base points, multipliers, misc values, mechanic, trigger spell, amplitude and class mask per effect.'), +('spellinfo targets', 2, 'Syntax: .spellinfo targets #spellid\n\nDisplays target data for spell #spellid including target mask, creature type, max affected targets, and per-effect TargetA, TargetB, radius and chain targets.'), +('spellinfo all', 2, 'Syntax: .spellinfo all #spellid\n\nDisplays all available data for spell #spellid including attributes, general properties, effects and targets.'); diff --git a/src/server/scripts/Commands/cs_script_loader.cpp b/src/server/scripts/Commands/cs_script_loader.cpp index 7e667a66c..68bd683f7 100644 --- a/src/server/scripts/Commands/cs_script_loader.cpp +++ b/src/server/scripts/Commands/cs_script_loader.cpp @@ -56,6 +56,7 @@ void AddSC_reset_commandscript(); void AddSC_send_commandscript(); void AddSC_server_commandscript(); void AddSC_spectator_commandscript(); +void AddSC_spellinfo_commandscript(); void AddSC_tele_commandscript(); void AddSC_ticket_commandscript(); void AddSC_titles_commandscript(); @@ -109,6 +110,7 @@ void AddCommandsScripts() AddSC_send_commandscript(); AddSC_server_commandscript(); AddSC_spectator_commandscript(); + AddSC_spellinfo_commandscript(); AddSC_tele_commandscript(); AddSC_ticket_commandscript(); AddSC_titles_commandscript(); diff --git a/src/server/scripts/Commands/cs_spellinfo.cpp b/src/server/scripts/Commands/cs_spellinfo.cpp new file mode 100644 index 000000000..46bf55b2e --- /dev/null +++ b/src/server/scripts/Commands/cs_spellinfo.cpp @@ -0,0 +1,988 @@ +/* + * This file is part of the AzerothCore Project. See AUTHORS file for Copyright information + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along + * with this program. If not, see . + */ + +#include "Chat.h" +#include "CommandScript.h" +#include "DBCStructure.h" +#include "Language.h" +#include "SmartEnum.h" +#include "SpellAuraDefines.h" +#include "SpellInfo.h" +#include "SpellMgr.h" + +using namespace Acore::ChatCommands; + +class spellinfo_commandscript : public CommandScript +{ +public: + spellinfo_commandscript() : CommandScript("spellinfo_commandscript") { } + + ChatCommandTable GetCommands() const override + { + static ChatCommandTable spellinfoCommandTable = + { + { "attributes", HandleSpellInfoAttributesCommand, SEC_GAMEMASTER, Console::Yes }, + { "effects", HandleSpellInfoEffectsCommand, SEC_GAMEMASTER, Console::Yes }, + { "targets", HandleSpellInfoTargetsCommand, SEC_GAMEMASTER, Console::Yes }, + { "all", HandleSpellInfoAllCommand, SEC_GAMEMASTER, Console::Yes } + }; + + static ChatCommandTable commandTable = + { + { "spellinfo", spellinfoCommandTable } + }; + + return commandTable; + } + + static char const* GetSpellEffectName(uint32 effect) + { + switch (effect) + { + case SPELL_EFFECT_INSTAKILL: return "SPELL_EFFECT_INSTAKILL"; + case SPELL_EFFECT_SCHOOL_DAMAGE: return "SPELL_EFFECT_SCHOOL_DAMAGE"; + case SPELL_EFFECT_DUMMY: return "SPELL_EFFECT_DUMMY"; + case SPELL_EFFECT_PORTAL_TELEPORT: return "SPELL_EFFECT_PORTAL_TELEPORT"; + case SPELL_EFFECT_TELEPORT_UNITS: return "SPELL_EFFECT_TELEPORT_UNITS"; + case SPELL_EFFECT_APPLY_AURA: return "SPELL_EFFECT_APPLY_AURA"; + case SPELL_EFFECT_ENVIRONMENTAL_DAMAGE: return "SPELL_EFFECT_ENVIRONMENTAL_DAMAGE"; + case SPELL_EFFECT_POWER_DRAIN: return "SPELL_EFFECT_POWER_DRAIN"; + case SPELL_EFFECT_HEALTH_LEECH: return "SPELL_EFFECT_HEALTH_LEECH"; + case SPELL_EFFECT_HEAL: return "SPELL_EFFECT_HEAL"; + case SPELL_EFFECT_BIND: return "SPELL_EFFECT_BIND"; + case SPELL_EFFECT_PORTAL: return "SPELL_EFFECT_PORTAL"; + case SPELL_EFFECT_RITUAL_BASE: return "SPELL_EFFECT_RITUAL_BASE"; + case SPELL_EFFECT_RITUAL_SPECIALIZE: return "SPELL_EFFECT_RITUAL_SPECIALIZE"; + case SPELL_EFFECT_RITUAL_ACTIVATE_PORTAL: return "SPELL_EFFECT_RITUAL_ACTIVATE_PORTAL"; + case SPELL_EFFECT_QUEST_COMPLETE: return "SPELL_EFFECT_QUEST_COMPLETE"; + case SPELL_EFFECT_WEAPON_DAMAGE_NOSCHOOL: return "SPELL_EFFECT_WEAPON_DAMAGE_NOSCHOOL"; + case SPELL_EFFECT_RESURRECT: return "SPELL_EFFECT_RESURRECT"; + case SPELL_EFFECT_ADD_EXTRA_ATTACKS: return "SPELL_EFFECT_ADD_EXTRA_ATTACKS"; + case SPELL_EFFECT_DODGE: return "SPELL_EFFECT_DODGE"; + case SPELL_EFFECT_EVADE: return "SPELL_EFFECT_EVADE"; + case SPELL_EFFECT_PARRY: return "SPELL_EFFECT_PARRY"; + case SPELL_EFFECT_BLOCK: return "SPELL_EFFECT_BLOCK"; + case SPELL_EFFECT_CREATE_ITEM: return "SPELL_EFFECT_CREATE_ITEM"; + case SPELL_EFFECT_WEAPON: return "SPELL_EFFECT_WEAPON"; + case SPELL_EFFECT_DEFENSE: return "SPELL_EFFECT_DEFENSE"; + case SPELL_EFFECT_PERSISTENT_AREA_AURA: return "SPELL_EFFECT_PERSISTENT_AREA_AURA"; + case SPELL_EFFECT_SUMMON: return "SPELL_EFFECT_SUMMON"; + case SPELL_EFFECT_LEAP: return "SPELL_EFFECT_LEAP"; + case SPELL_EFFECT_ENERGIZE: return "SPELL_EFFECT_ENERGIZE"; + case SPELL_EFFECT_WEAPON_PERCENT_DAMAGE: return "SPELL_EFFECT_WEAPON_PERCENT_DAMAGE"; + case SPELL_EFFECT_TRIGGER_MISSILE: return "SPELL_EFFECT_TRIGGER_MISSILE"; + case SPELL_EFFECT_OPEN_LOCK: return "SPELL_EFFECT_OPEN_LOCK"; + case SPELL_EFFECT_SUMMON_CHANGE_ITEM: return "SPELL_EFFECT_SUMMON_CHANGE_ITEM"; + case SPELL_EFFECT_APPLY_AREA_AURA_PARTY: return "SPELL_EFFECT_APPLY_AREA_AURA_PARTY"; + case SPELL_EFFECT_LEARN_SPELL: return "SPELL_EFFECT_LEARN_SPELL"; + case SPELL_EFFECT_SPELL_DEFENSE: return "SPELL_EFFECT_SPELL_DEFENSE"; + case SPELL_EFFECT_DISPEL: return "SPELL_EFFECT_DISPEL"; + case SPELL_EFFECT_LANGUAGE: return "SPELL_EFFECT_LANGUAGE"; + case SPELL_EFFECT_DUAL_WIELD: return "SPELL_EFFECT_DUAL_WIELD"; + case SPELL_EFFECT_JUMP: return "SPELL_EFFECT_JUMP"; + case SPELL_EFFECT_JUMP_DEST: return "SPELL_EFFECT_JUMP_DEST"; + case SPELL_EFFECT_TELEPORT_UNITS_FACE_CASTER: return "SPELL_EFFECT_TELEPORT_UNITS_FACE_CASTER"; + case SPELL_EFFECT_SKILL_STEP: return "SPELL_EFFECT_SKILL_STEP"; + case SPELL_EFFECT_ADD_HONOR: return "SPELL_EFFECT_ADD_HONOR"; + case SPELL_EFFECT_SPAWN: return "SPELL_EFFECT_SPAWN"; + case SPELL_EFFECT_TRADE_SKILL: return "SPELL_EFFECT_TRADE_SKILL"; + case SPELL_EFFECT_STEALTH: return "SPELL_EFFECT_STEALTH"; + case SPELL_EFFECT_DETECT: return "SPELL_EFFECT_DETECT"; + case SPELL_EFFECT_TRANS_DOOR: return "SPELL_EFFECT_TRANS_DOOR"; + case SPELL_EFFECT_FORCE_CRITICAL_HIT: return "SPELL_EFFECT_FORCE_CRITICAL_HIT"; + case SPELL_EFFECT_GUARANTEE_HIT: return "SPELL_EFFECT_GUARANTEE_HIT"; + case SPELL_EFFECT_ENCHANT_ITEM: return "SPELL_EFFECT_ENCHANT_ITEM"; + case SPELL_EFFECT_ENCHANT_ITEM_TEMPORARY: return "SPELL_EFFECT_ENCHANT_ITEM_TEMPORARY"; + case SPELL_EFFECT_TAMECREATURE: return "SPELL_EFFECT_TAMECREATURE"; + case SPELL_EFFECT_SUMMON_PET: return "SPELL_EFFECT_SUMMON_PET"; + case SPELL_EFFECT_LEARN_PET_SPELL: return "SPELL_EFFECT_LEARN_PET_SPELL"; + case SPELL_EFFECT_WEAPON_DAMAGE: return "SPELL_EFFECT_WEAPON_DAMAGE"; + case SPELL_EFFECT_CREATE_RANDOM_ITEM: return "SPELL_EFFECT_CREATE_RANDOM_ITEM"; + case SPELL_EFFECT_PROFICIENCY: return "SPELL_EFFECT_PROFICIENCY"; + case SPELL_EFFECT_SEND_EVENT: return "SPELL_EFFECT_SEND_EVENT"; + case SPELL_EFFECT_POWER_BURN: return "SPELL_EFFECT_POWER_BURN"; + case SPELL_EFFECT_THREAT: return "SPELL_EFFECT_THREAT"; + case SPELL_EFFECT_TRIGGER_SPELL: return "SPELL_EFFECT_TRIGGER_SPELL"; + case SPELL_EFFECT_APPLY_AREA_AURA_RAID: return "SPELL_EFFECT_APPLY_AREA_AURA_RAID"; + case SPELL_EFFECT_CREATE_MANA_GEM: return "SPELL_EFFECT_CREATE_MANA_GEM"; + case SPELL_EFFECT_HEAL_MAX_HEALTH: return "SPELL_EFFECT_HEAL_MAX_HEALTH"; + case SPELL_EFFECT_INTERRUPT_CAST: return "SPELL_EFFECT_INTERRUPT_CAST"; + case SPELL_EFFECT_DISTRACT: return "SPELL_EFFECT_DISTRACT"; + case SPELL_EFFECT_PULL: return "SPELL_EFFECT_PULL"; + case SPELL_EFFECT_PICKPOCKET: return "SPELL_EFFECT_PICKPOCKET"; + case SPELL_EFFECT_ADD_FARSIGHT: return "SPELL_EFFECT_ADD_FARSIGHT"; + case SPELL_EFFECT_UNTRAIN_TALENTS: return "SPELL_EFFECT_UNTRAIN_TALENTS"; + case SPELL_EFFECT_APPLY_GLYPH: return "SPELL_EFFECT_APPLY_GLYPH"; + case SPELL_EFFECT_HEAL_MECHANICAL: return "SPELL_EFFECT_HEAL_MECHANICAL"; + case SPELL_EFFECT_SUMMON_OBJECT_WILD: return "SPELL_EFFECT_SUMMON_OBJECT_WILD"; + case SPELL_EFFECT_SCRIPT_EFFECT: return "SPELL_EFFECT_SCRIPT_EFFECT"; + case SPELL_EFFECT_ATTACK: return "SPELL_EFFECT_ATTACK"; + case SPELL_EFFECT_SANCTUARY: return "SPELL_EFFECT_SANCTUARY"; + case SPELL_EFFECT_ADD_COMBO_POINTS: return "SPELL_EFFECT_ADD_COMBO_POINTS"; + case SPELL_EFFECT_CREATE_HOUSE: return "SPELL_EFFECT_CREATE_HOUSE"; + case SPELL_EFFECT_BIND_SIGHT: return "SPELL_EFFECT_BIND_SIGHT"; + case SPELL_EFFECT_DUEL: return "SPELL_EFFECT_DUEL"; + case SPELL_EFFECT_STUCK: return "SPELL_EFFECT_STUCK"; + case SPELL_EFFECT_SUMMON_PLAYER: return "SPELL_EFFECT_SUMMON_PLAYER"; + case SPELL_EFFECT_ACTIVATE_OBJECT: return "SPELL_EFFECT_ACTIVATE_OBJECT"; + case SPELL_EFFECT_GAMEOBJECT_DAMAGE: return "SPELL_EFFECT_GAMEOBJECT_DAMAGE"; + case SPELL_EFFECT_GAMEOBJECT_REPAIR: return "SPELL_EFFECT_GAMEOBJECT_REPAIR"; + case SPELL_EFFECT_GAMEOBJECT_SET_DESTRUCTION_STATE: return "SPELL_EFFECT_GAMEOBJECT_SET_DESTRUCTION_STATE"; + case SPELL_EFFECT_KILL_CREDIT: return "SPELL_EFFECT_KILL_CREDIT"; + case SPELL_EFFECT_THREAT_ALL: return "SPELL_EFFECT_THREAT_ALL"; + case SPELL_EFFECT_ENCHANT_HELD_ITEM: return "SPELL_EFFECT_ENCHANT_HELD_ITEM"; + case SPELL_EFFECT_FORCE_DESELECT: return "SPELL_EFFECT_FORCE_DESELECT"; + case SPELL_EFFECT_SELF_RESURRECT: return "SPELL_EFFECT_SELF_RESURRECT"; + case SPELL_EFFECT_SKINNING: return "SPELL_EFFECT_SKINNING"; + case SPELL_EFFECT_CHARGE: return "SPELL_EFFECT_CHARGE"; + case SPELL_EFFECT_CAST_BUTTON: return "SPELL_EFFECT_CAST_BUTTON"; + case SPELL_EFFECT_KNOCK_BACK: return "SPELL_EFFECT_KNOCK_BACK"; + case SPELL_EFFECT_DISENCHANT: return "SPELL_EFFECT_DISENCHANT"; + case SPELL_EFFECT_INEBRIATE: return "SPELL_EFFECT_INEBRIATE"; + case SPELL_EFFECT_FEED_PET: return "SPELL_EFFECT_FEED_PET"; + case SPELL_EFFECT_DISMISS_PET: return "SPELL_EFFECT_DISMISS_PET"; + case SPELL_EFFECT_REPUTATION: return "SPELL_EFFECT_REPUTATION"; + case SPELL_EFFECT_SUMMON_OBJECT_SLOT1: return "SPELL_EFFECT_SUMMON_OBJECT_SLOT1"; + case SPELL_EFFECT_SUMMON_OBJECT_SLOT2: return "SPELL_EFFECT_SUMMON_OBJECT_SLOT2"; + case SPELL_EFFECT_SUMMON_OBJECT_SLOT3: return "SPELL_EFFECT_SUMMON_OBJECT_SLOT3"; + case SPELL_EFFECT_SUMMON_OBJECT_SLOT4: return "SPELL_EFFECT_SUMMON_OBJECT_SLOT4"; + case SPELL_EFFECT_DISPEL_MECHANIC: return "SPELL_EFFECT_DISPEL_MECHANIC"; + case SPELL_EFFECT_RESURRECT_PET: return "SPELL_EFFECT_RESURRECT_PET"; + case SPELL_EFFECT_DESTROY_ALL_TOTEMS: return "SPELL_EFFECT_DESTROY_ALL_TOTEMS"; + case SPELL_EFFECT_DURABILITY_DAMAGE: return "SPELL_EFFECT_DURABILITY_DAMAGE"; + case SPELL_EFFECT_112: return "SPELL_EFFECT_112"; + case SPELL_EFFECT_RESURRECT_NEW: return "SPELL_EFFECT_RESURRECT_NEW"; + case SPELL_EFFECT_ATTACK_ME: return "SPELL_EFFECT_ATTACK_ME"; + case SPELL_EFFECT_DURABILITY_DAMAGE_PCT: return "SPELL_EFFECT_DURABILITY_DAMAGE_PCT"; + case SPELL_EFFECT_SKIN_PLAYER_CORPSE: return "SPELL_EFFECT_SKIN_PLAYER_CORPSE"; + case SPELL_EFFECT_SPIRIT_HEAL: return "SPELL_EFFECT_SPIRIT_HEAL"; + case SPELL_EFFECT_SKILL: return "SPELL_EFFECT_SKILL"; + case SPELL_EFFECT_APPLY_AREA_AURA_PET: return "SPELL_EFFECT_APPLY_AREA_AURA_PET"; + case SPELL_EFFECT_TELEPORT_GRAVEYARD: return "SPELL_EFFECT_TELEPORT_GRAVEYARD"; + case SPELL_EFFECT_NORMALIZED_WEAPON_DMG: return "SPELL_EFFECT_NORMALIZED_WEAPON_DMG"; + case SPELL_EFFECT_122: return "SPELL_EFFECT_122"; + case SPELL_EFFECT_SEND_TAXI: return "SPELL_EFFECT_SEND_TAXI"; + case SPELL_EFFECT_PULL_TOWARDS: return "SPELL_EFFECT_PULL_TOWARDS"; + case SPELL_EFFECT_MODIFY_THREAT_PERCENT: return "SPELL_EFFECT_MODIFY_THREAT_PERCENT"; + case SPELL_EFFECT_STEAL_BENEFICIAL_BUFF: return "SPELL_EFFECT_STEAL_BENEFICIAL_BUFF"; + case SPELL_EFFECT_PROSPECTING: return "SPELL_EFFECT_PROSPECTING"; + case SPELL_EFFECT_APPLY_AREA_AURA_FRIEND: return "SPELL_EFFECT_APPLY_AREA_AURA_FRIEND"; + case SPELL_EFFECT_APPLY_AREA_AURA_ENEMY: return "SPELL_EFFECT_APPLY_AREA_AURA_ENEMY"; + case SPELL_EFFECT_REDIRECT_THREAT: return "SPELL_EFFECT_REDIRECT_THREAT"; + case SPELL_EFFECT_PLAY_SOUND: return "SPELL_EFFECT_PLAY_SOUND"; + case SPELL_EFFECT_PLAY_MUSIC: return "SPELL_EFFECT_PLAY_MUSIC"; + case SPELL_EFFECT_UNLEARN_SPECIALIZATION: return "SPELL_EFFECT_UNLEARN_SPECIALIZATION"; + case SPELL_EFFECT_KILL_CREDIT2: return "SPELL_EFFECT_KILL_CREDIT2"; + case SPELL_EFFECT_CALL_PET: return "SPELL_EFFECT_CALL_PET"; + case SPELL_EFFECT_HEAL_PCT: return "SPELL_EFFECT_HEAL_PCT"; + case SPELL_EFFECT_ENERGIZE_PCT: return "SPELL_EFFECT_ENERGIZE_PCT"; + case SPELL_EFFECT_LEAP_BACK: return "SPELL_EFFECT_LEAP_BACK"; + case SPELL_EFFECT_CLEAR_QUEST: return "SPELL_EFFECT_CLEAR_QUEST"; + case SPELL_EFFECT_FORCE_CAST: return "SPELL_EFFECT_FORCE_CAST"; + case SPELL_EFFECT_FORCE_CAST_WITH_VALUE: return "SPELL_EFFECT_FORCE_CAST_WITH_VALUE"; + case SPELL_EFFECT_TRIGGER_SPELL_WITH_VALUE: return "SPELL_EFFECT_TRIGGER_SPELL_WITH_VALUE"; + case SPELL_EFFECT_APPLY_AREA_AURA_OWNER: return "SPELL_EFFECT_APPLY_AREA_AURA_OWNER"; + case SPELL_EFFECT_KNOCK_BACK_DEST: return "SPELL_EFFECT_KNOCK_BACK_DEST"; + case SPELL_EFFECT_PULL_TOWARDS_DEST: return "SPELL_EFFECT_PULL_TOWARDS_DEST"; + case SPELL_EFFECT_ACTIVATE_RUNE: return "SPELL_EFFECT_ACTIVATE_RUNE"; + case SPELL_EFFECT_QUEST_FAIL: return "SPELL_EFFECT_QUEST_FAIL"; + case SPELL_EFFECT_TRIGGER_MISSILE_SPELL_WITH_VALUE: return "SPELL_EFFECT_TRIGGER_MISSILE_SPELL_WITH_VALUE"; + case SPELL_EFFECT_CHARGE_DEST: return "SPELL_EFFECT_CHARGE_DEST"; + case SPELL_EFFECT_QUEST_START: return "SPELL_EFFECT_QUEST_START"; + case SPELL_EFFECT_TRIGGER_SPELL_2: return "SPELL_EFFECT_TRIGGER_SPELL_2"; + case SPELL_EFFECT_SUMMON_RAF_FRIEND: return "SPELL_EFFECT_SUMMON_RAF_FRIEND"; + case SPELL_EFFECT_CREATE_TAMED_PET: return "SPELL_EFFECT_CREATE_TAMED_PET"; + case SPELL_EFFECT_DISCOVER_TAXI: return "SPELL_EFFECT_DISCOVER_TAXI"; + case SPELL_EFFECT_TITAN_GRIP: return "SPELL_EFFECT_TITAN_GRIP"; + case SPELL_EFFECT_ENCHANT_ITEM_PRISMATIC: return "SPELL_EFFECT_ENCHANT_ITEM_PRISMATIC"; + case SPELL_EFFECT_CREATE_ITEM_2: return "SPELL_EFFECT_CREATE_ITEM_2"; + case SPELL_EFFECT_MILLING: return "SPELL_EFFECT_MILLING"; + case SPELL_EFFECT_ALLOW_RENAME_PET: return "SPELL_EFFECT_ALLOW_RENAME_PET"; + case SPELL_EFFECT_FORCE_CAST_2: return "SPELL_EFFECT_FORCE_CAST_2"; + case SPELL_EFFECT_TALENT_SPEC_COUNT: return "SPELL_EFFECT_TALENT_SPEC_COUNT"; + case SPELL_EFFECT_TALENT_SPEC_SELECT: return "SPELL_EFFECT_TALENT_SPEC_SELECT"; + case SPELL_EFFECT_163: return "SPELL_EFFECT_163"; + case SPELL_EFFECT_REMOVE_AURA: return "SPELL_EFFECT_REMOVE_AURA"; + default: return "UNKNOWN_EFFECT"; + } + } + + static char const* GetAuraTypeName(uint32 aura) + { + switch (aura) + { + case SPELL_AURA_NONE: return "SPELL_AURA_NONE"; + case SPELL_AURA_BIND_SIGHT: return "SPELL_AURA_BIND_SIGHT"; + case SPELL_AURA_MOD_POSSESS: return "SPELL_AURA_MOD_POSSESS"; + case SPELL_AURA_PERIODIC_DAMAGE: return "SPELL_AURA_PERIODIC_DAMAGE"; + case SPELL_AURA_DUMMY: return "SPELL_AURA_DUMMY"; + case SPELL_AURA_MOD_CONFUSE: return "SPELL_AURA_MOD_CONFUSE"; + case SPELL_AURA_MOD_CHARM: return "SPELL_AURA_MOD_CHARM"; + case SPELL_AURA_MOD_FEAR: return "SPELL_AURA_MOD_FEAR"; + case SPELL_AURA_PERIODIC_HEAL: return "SPELL_AURA_PERIODIC_HEAL"; + case SPELL_AURA_MOD_ATTACKSPEED: return "SPELL_AURA_MOD_ATTACKSPEED"; + case SPELL_AURA_MOD_THREAT: return "SPELL_AURA_MOD_THREAT"; + case SPELL_AURA_MOD_TAUNT: return "SPELL_AURA_MOD_TAUNT"; + case SPELL_AURA_MOD_STUN: return "SPELL_AURA_MOD_STUN"; + case SPELL_AURA_MOD_DAMAGE_DONE: return "SPELL_AURA_MOD_DAMAGE_DONE"; + case SPELL_AURA_MOD_DAMAGE_TAKEN: return "SPELL_AURA_MOD_DAMAGE_TAKEN"; + case SPELL_AURA_DAMAGE_SHIELD: return "SPELL_AURA_DAMAGE_SHIELD"; + case SPELL_AURA_MOD_STEALTH: return "SPELL_AURA_MOD_STEALTH"; + case SPELL_AURA_MOD_STEALTH_DETECT: return "SPELL_AURA_MOD_STEALTH_DETECT"; + case SPELL_AURA_MOD_INVISIBILITY: return "SPELL_AURA_MOD_INVISIBILITY"; + case SPELL_AURA_MOD_INVISIBILITY_DETECT: return "SPELL_AURA_MOD_INVISIBILITY_DETECT"; + case SPELL_AURA_OBS_MOD_HEALTH: return "SPELL_AURA_OBS_MOD_HEALTH"; + case SPELL_AURA_OBS_MOD_POWER: return "SPELL_AURA_OBS_MOD_POWER"; + case SPELL_AURA_MOD_RESISTANCE: return "SPELL_AURA_MOD_RESISTANCE"; + case SPELL_AURA_PERIODIC_TRIGGER_SPELL: return "SPELL_AURA_PERIODIC_TRIGGER_SPELL"; + case SPELL_AURA_PERIODIC_ENERGIZE: return "SPELL_AURA_PERIODIC_ENERGIZE"; + case SPELL_AURA_MOD_PACIFY: return "SPELL_AURA_MOD_PACIFY"; + case SPELL_AURA_MOD_ROOT: return "SPELL_AURA_MOD_ROOT"; + case SPELL_AURA_MOD_SILENCE: return "SPELL_AURA_MOD_SILENCE"; + case SPELL_AURA_REFLECT_SPELLS: return "SPELL_AURA_REFLECT_SPELLS"; + case SPELL_AURA_MOD_STAT: return "SPELL_AURA_MOD_STAT"; + case SPELL_AURA_MOD_SKILL: return "SPELL_AURA_MOD_SKILL"; + case SPELL_AURA_MOD_INCREASE_SPEED: return "SPELL_AURA_MOD_INCREASE_SPEED"; + case SPELL_AURA_MOD_INCREASE_MOUNTED_SPEED: return "SPELL_AURA_MOD_INCREASE_MOUNTED_SPEED"; + case SPELL_AURA_MOD_DECREASE_SPEED: return "SPELL_AURA_MOD_DECREASE_SPEED"; + case SPELL_AURA_MOD_INCREASE_HEALTH: return "SPELL_AURA_MOD_INCREASE_HEALTH"; + case SPELL_AURA_MOD_INCREASE_ENERGY: return "SPELL_AURA_MOD_INCREASE_ENERGY"; + case SPELL_AURA_MOD_SHAPESHIFT: return "SPELL_AURA_MOD_SHAPESHIFT"; + case SPELL_AURA_EFFECT_IMMUNITY: return "SPELL_AURA_EFFECT_IMMUNITY"; + case SPELL_AURA_STATE_IMMUNITY: return "SPELL_AURA_STATE_IMMUNITY"; + case SPELL_AURA_SCHOOL_IMMUNITY: return "SPELL_AURA_SCHOOL_IMMUNITY"; + case SPELL_AURA_DAMAGE_IMMUNITY: return "SPELL_AURA_DAMAGE_IMMUNITY"; + case SPELL_AURA_DISPEL_IMMUNITY: return "SPELL_AURA_DISPEL_IMMUNITY"; + case SPELL_AURA_PROC_TRIGGER_SPELL: return "SPELL_AURA_PROC_TRIGGER_SPELL"; + case SPELL_AURA_PROC_TRIGGER_DAMAGE: return "SPELL_AURA_PROC_TRIGGER_DAMAGE"; + case SPELL_AURA_TRACK_CREATURES: return "SPELL_AURA_TRACK_CREATURES"; + case SPELL_AURA_TRACK_RESOURCES: return "SPELL_AURA_TRACK_RESOURCES"; + case SPELL_AURA_46: return "SPELL_AURA_46"; + case SPELL_AURA_MOD_PARRY_PERCENT: return "SPELL_AURA_MOD_PARRY_PERCENT"; + case SPELL_AURA_PERIODIC_TRIGGER_SPELL_FROM_CLIENT: return "SPELL_AURA_PERIODIC_TRIGGER_SPELL_FROM_CLIENT"; + case SPELL_AURA_MOD_DODGE_PERCENT: return "SPELL_AURA_MOD_DODGE_PERCENT"; + case SPELL_AURA_MOD_CRITICAL_HEALING_AMOUNT: return "SPELL_AURA_MOD_CRITICAL_HEALING_AMOUNT"; + case SPELL_AURA_MOD_BLOCK_PERCENT: return "SPELL_AURA_MOD_BLOCK_PERCENT"; + case SPELL_AURA_MOD_WEAPON_CRIT_PERCENT: return "SPELL_AURA_MOD_WEAPON_CRIT_PERCENT"; + case SPELL_AURA_PERIODIC_LEECH: return "SPELL_AURA_PERIODIC_LEECH"; + case SPELL_AURA_MOD_HIT_CHANCE: return "SPELL_AURA_MOD_HIT_CHANCE"; + case SPELL_AURA_MOD_SPELL_HIT_CHANCE: return "SPELL_AURA_MOD_SPELL_HIT_CHANCE"; + case SPELL_AURA_TRANSFORM: return "SPELL_AURA_TRANSFORM"; + case SPELL_AURA_MOD_SPELL_CRIT_CHANCE: return "SPELL_AURA_MOD_SPELL_CRIT_CHANCE"; + case SPELL_AURA_MOD_INCREASE_SWIM_SPEED: return "SPELL_AURA_MOD_INCREASE_SWIM_SPEED"; + case SPELL_AURA_MOD_DAMAGE_DONE_CREATURE: return "SPELL_AURA_MOD_DAMAGE_DONE_CREATURE"; + case SPELL_AURA_MOD_PACIFY_SILENCE: return "SPELL_AURA_MOD_PACIFY_SILENCE"; + case SPELL_AURA_MOD_SCALE: return "SPELL_AURA_MOD_SCALE"; + case SPELL_AURA_PERIODIC_HEALTH_FUNNEL: return "SPELL_AURA_PERIODIC_HEALTH_FUNNEL"; + case SPELL_AURA_63: return "SPELL_AURA_63"; + case SPELL_AURA_PERIODIC_MANA_LEECH: return "SPELL_AURA_PERIODIC_MANA_LEECH"; + case SPELL_AURA_MOD_CASTING_SPEED_NOT_STACK: return "SPELL_AURA_MOD_CASTING_SPEED_NOT_STACK"; + case SPELL_AURA_FEIGN_DEATH: return "SPELL_AURA_FEIGN_DEATH"; + case SPELL_AURA_MOD_DISARM: return "SPELL_AURA_MOD_DISARM"; + case SPELL_AURA_MOD_STALKED: return "SPELL_AURA_MOD_STALKED"; + case SPELL_AURA_SCHOOL_ABSORB: return "SPELL_AURA_SCHOOL_ABSORB"; + case SPELL_AURA_EXTRA_ATTACKS: return "SPELL_AURA_EXTRA_ATTACKS"; + case SPELL_AURA_MOD_SPELL_CRIT_CHANCE_SCHOOL: return "SPELL_AURA_MOD_SPELL_CRIT_CHANCE_SCHOOL"; + case SPELL_AURA_MOD_POWER_COST_SCHOOL_PCT: return "SPELL_AURA_MOD_POWER_COST_SCHOOL_PCT"; + case SPELL_AURA_MOD_POWER_COST_SCHOOL: return "SPELL_AURA_MOD_POWER_COST_SCHOOL"; + case SPELL_AURA_REFLECT_SPELLS_SCHOOL: return "SPELL_AURA_REFLECT_SPELLS_SCHOOL"; + case SPELL_AURA_MOD_LANGUAGE: return "SPELL_AURA_MOD_LANGUAGE"; + case SPELL_AURA_FAR_SIGHT: return "SPELL_AURA_FAR_SIGHT"; + case SPELL_AURA_MECHANIC_IMMUNITY: return "SPELL_AURA_MECHANIC_IMMUNITY"; + case SPELL_AURA_MOUNTED: return "SPELL_AURA_MOUNTED"; + case SPELL_AURA_MOD_DAMAGE_PERCENT_DONE: return "SPELL_AURA_MOD_DAMAGE_PERCENT_DONE"; + case SPELL_AURA_MOD_PERCENT_STAT: return "SPELL_AURA_MOD_PERCENT_STAT"; + case SPELL_AURA_SPLIT_DAMAGE_PCT: return "SPELL_AURA_SPLIT_DAMAGE_PCT"; + case SPELL_AURA_WATER_BREATHING: return "SPELL_AURA_WATER_BREATHING"; + case SPELL_AURA_MOD_BASE_RESISTANCE: return "SPELL_AURA_MOD_BASE_RESISTANCE"; + case SPELL_AURA_MOD_REGEN: return "SPELL_AURA_MOD_REGEN"; + case SPELL_AURA_MOD_POWER_REGEN: return "SPELL_AURA_MOD_POWER_REGEN"; + case SPELL_AURA_CHANNEL_DEATH_ITEM: return "SPELL_AURA_CHANNEL_DEATH_ITEM"; + case SPELL_AURA_MOD_DAMAGE_PERCENT_TAKEN: return "SPELL_AURA_MOD_DAMAGE_PERCENT_TAKEN"; + case SPELL_AURA_MOD_HEALTH_REGEN_PERCENT: return "SPELL_AURA_MOD_HEALTH_REGEN_PERCENT"; + case SPELL_AURA_PERIODIC_DAMAGE_PERCENT: return "SPELL_AURA_PERIODIC_DAMAGE_PERCENT"; + case SPELL_AURA_90: return "SPELL_AURA_90"; + case SPELL_AURA_MOD_DETECT_RANGE: return "SPELL_AURA_MOD_DETECT_RANGE"; + case SPELL_AURA_PREVENTS_FLEEING: return "SPELL_AURA_PREVENTS_FLEEING"; + case SPELL_AURA_MOD_UNATTACKABLE: return "SPELL_AURA_MOD_UNATTACKABLE"; + case SPELL_AURA_INTERRUPT_REGEN: return "SPELL_AURA_INTERRUPT_REGEN"; + case SPELL_AURA_GHOST: return "SPELL_AURA_GHOST"; + case SPELL_AURA_SPELL_MAGNET: return "SPELL_AURA_SPELL_MAGNET"; + case SPELL_AURA_MANA_SHIELD: return "SPELL_AURA_MANA_SHIELD"; + case SPELL_AURA_MOD_SKILL_TALENT: return "SPELL_AURA_MOD_SKILL_TALENT"; + case SPELL_AURA_MOD_ATTACK_POWER: return "SPELL_AURA_MOD_ATTACK_POWER"; + case SPELL_AURA_AURAS_VISIBLE: return "SPELL_AURA_AURAS_VISIBLE"; + case SPELL_AURA_MOD_RESISTANCE_PCT: return "SPELL_AURA_MOD_RESISTANCE_PCT"; + case SPELL_AURA_MOD_MELEE_ATTACK_POWER_VERSUS: return "SPELL_AURA_MOD_MELEE_ATTACK_POWER_VERSUS"; + case SPELL_AURA_MOD_TOTAL_THREAT: return "SPELL_AURA_MOD_TOTAL_THREAT"; + case SPELL_AURA_WATER_WALK: return "SPELL_AURA_WATER_WALK"; + case SPELL_AURA_FEATHER_FALL: return "SPELL_AURA_FEATHER_FALL"; + case SPELL_AURA_HOVER: return "SPELL_AURA_HOVER"; + case SPELL_AURA_ADD_FLAT_MODIFIER: return "SPELL_AURA_ADD_FLAT_MODIFIER"; + case SPELL_AURA_ADD_PCT_MODIFIER: return "SPELL_AURA_ADD_PCT_MODIFIER"; + case SPELL_AURA_ADD_TARGET_TRIGGER: return "SPELL_AURA_ADD_TARGET_TRIGGER"; + case SPELL_AURA_MOD_POWER_REGEN_PERCENT: return "SPELL_AURA_MOD_POWER_REGEN_PERCENT"; + case SPELL_AURA_ADD_CASTER_HIT_TRIGGER: return "SPELL_AURA_ADD_CASTER_HIT_TRIGGER"; + case SPELL_AURA_OVERRIDE_CLASS_SCRIPTS: return "SPELL_AURA_OVERRIDE_CLASS_SCRIPTS"; + case SPELL_AURA_MOD_RANGED_DAMAGE_TAKEN: return "SPELL_AURA_MOD_RANGED_DAMAGE_TAKEN"; + case SPELL_AURA_MOD_RANGED_DAMAGE_TAKEN_PCT: return "SPELL_AURA_MOD_RANGED_DAMAGE_TAKEN_PCT"; + case SPELL_AURA_MOD_HEALING: return "SPELL_AURA_MOD_HEALING"; + case SPELL_AURA_MOD_REGEN_DURING_COMBAT: return "SPELL_AURA_MOD_REGEN_DURING_COMBAT"; + case SPELL_AURA_MOD_MECHANIC_RESISTANCE: return "SPELL_AURA_MOD_MECHANIC_RESISTANCE"; + case SPELL_AURA_MOD_HEALING_PCT: return "SPELL_AURA_MOD_HEALING_PCT"; + case SPELL_AURA_119: return "SPELL_AURA_119"; + case SPELL_AURA_UNTRACKABLE: return "SPELL_AURA_UNTRACKABLE"; + case SPELL_AURA_EMPATHY: return "SPELL_AURA_EMPATHY"; + case SPELL_AURA_MOD_OFFHAND_DAMAGE_PCT: return "SPELL_AURA_MOD_OFFHAND_DAMAGE_PCT"; + case SPELL_AURA_MOD_TARGET_RESISTANCE: return "SPELL_AURA_MOD_TARGET_RESISTANCE"; + case SPELL_AURA_MOD_RANGED_ATTACK_POWER: return "SPELL_AURA_MOD_RANGED_ATTACK_POWER"; + case SPELL_AURA_MOD_MELEE_DAMAGE_TAKEN: return "SPELL_AURA_MOD_MELEE_DAMAGE_TAKEN"; + case SPELL_AURA_MOD_MELEE_DAMAGE_TAKEN_PCT: return "SPELL_AURA_MOD_MELEE_DAMAGE_TAKEN_PCT"; + case SPELL_AURA_RANGED_ATTACK_POWER_ATTACKER_BONUS: return "SPELL_AURA_RANGED_ATTACK_POWER_ATTACKER_BONUS"; + case SPELL_AURA_MOD_POSSESS_PET: return "SPELL_AURA_MOD_POSSESS_PET"; + case SPELL_AURA_MOD_SPEED_ALWAYS: return "SPELL_AURA_MOD_SPEED_ALWAYS"; + case SPELL_AURA_MOD_MOUNTED_SPEED_ALWAYS: return "SPELL_AURA_MOD_MOUNTED_SPEED_ALWAYS"; + case SPELL_AURA_MOD_RANGED_ATTACK_POWER_VERSUS: return "SPELL_AURA_MOD_RANGED_ATTACK_POWER_VERSUS"; + case SPELL_AURA_MOD_INCREASE_ENERGY_PERCENT: return "SPELL_AURA_MOD_INCREASE_ENERGY_PERCENT"; + case SPELL_AURA_MOD_INCREASE_HEALTH_PERCENT: return "SPELL_AURA_MOD_INCREASE_HEALTH_PERCENT"; + case SPELL_AURA_MOD_MANA_REGEN_INTERRUPT: return "SPELL_AURA_MOD_MANA_REGEN_INTERRUPT"; + case SPELL_AURA_MOD_HEALING_DONE: return "SPELL_AURA_MOD_HEALING_DONE"; + case SPELL_AURA_MOD_HEALING_DONE_PERCENT: return "SPELL_AURA_MOD_HEALING_DONE_PERCENT"; + case SPELL_AURA_MOD_TOTAL_STAT_PERCENTAGE: return "SPELL_AURA_MOD_TOTAL_STAT_PERCENTAGE"; + case SPELL_AURA_MOD_MELEE_HASTE: return "SPELL_AURA_MOD_MELEE_HASTE"; + case SPELL_AURA_FORCE_REACTION: return "SPELL_AURA_FORCE_REACTION"; + case SPELL_AURA_MOD_RANGED_HASTE: return "SPELL_AURA_MOD_RANGED_HASTE"; + case SPELL_AURA_MOD_RANGED_AMMO_HASTE: return "SPELL_AURA_MOD_RANGED_AMMO_HASTE"; + case SPELL_AURA_MOD_BASE_RESISTANCE_PCT: return "SPELL_AURA_MOD_BASE_RESISTANCE_PCT"; + case SPELL_AURA_MOD_RESISTANCE_EXCLUSIVE: return "SPELL_AURA_MOD_RESISTANCE_EXCLUSIVE"; + case SPELL_AURA_SAFE_FALL: return "SPELL_AURA_SAFE_FALL"; + case SPELL_AURA_MOD_PET_TALENT_POINTS: return "SPELL_AURA_MOD_PET_TALENT_POINTS"; + case SPELL_AURA_ALLOW_TAME_PET_TYPE: return "SPELL_AURA_ALLOW_TAME_PET_TYPE"; + case SPELL_AURA_MECHANIC_IMMUNITY_MASK: return "SPELL_AURA_MECHANIC_IMMUNITY_MASK"; + case SPELL_AURA_RETAIN_COMBO_POINTS: return "SPELL_AURA_RETAIN_COMBO_POINTS"; + case SPELL_AURA_REDUCE_PUSHBACK: return "SPELL_AURA_REDUCE_PUSHBACK"; + case SPELL_AURA_MOD_SHIELD_BLOCKVALUE_PCT: return "SPELL_AURA_MOD_SHIELD_BLOCKVALUE_PCT"; + case SPELL_AURA_TRACK_STEALTHED: return "SPELL_AURA_TRACK_STEALTHED"; + case SPELL_AURA_MOD_DETECTED_RANGE: return "SPELL_AURA_MOD_DETECTED_RANGE"; + case SPELL_AURA_SPLIT_DAMAGE_FLAT: return "SPELL_AURA_SPLIT_DAMAGE_FLAT"; + case SPELL_AURA_MOD_STEALTH_LEVEL: return "SPELL_AURA_MOD_STEALTH_LEVEL"; + case SPELL_AURA_MOD_WATER_BREATHING: return "SPELL_AURA_MOD_WATER_BREATHING"; + case SPELL_AURA_MOD_REPUTATION_GAIN: return "SPELL_AURA_MOD_REPUTATION_GAIN"; + case SPELL_AURA_PET_DAMAGE_MULTI: return "SPELL_AURA_PET_DAMAGE_MULTI"; + case SPELL_AURA_MOD_SHIELD_BLOCKVALUE: return "SPELL_AURA_MOD_SHIELD_BLOCKVALUE"; + case SPELL_AURA_NO_PVP_CREDIT: return "SPELL_AURA_NO_PVP_CREDIT"; + case SPELL_AURA_MOD_AOE_AVOIDANCE: return "SPELL_AURA_MOD_AOE_AVOIDANCE"; + case SPELL_AURA_MOD_HEALTH_REGEN_IN_COMBAT: return "SPELL_AURA_MOD_HEALTH_REGEN_IN_COMBAT"; + case SPELL_AURA_POWER_BURN: return "SPELL_AURA_POWER_BURN"; + case SPELL_AURA_MOD_CRIT_DAMAGE_BONUS: return "SPELL_AURA_MOD_CRIT_DAMAGE_BONUS"; + case SPELL_AURA_164: return "SPELL_AURA_164"; + case SPELL_AURA_MELEE_ATTACK_POWER_ATTACKER_BONUS: return "SPELL_AURA_MELEE_ATTACK_POWER_ATTACKER_BONUS"; + case SPELL_AURA_MOD_ATTACK_POWER_PCT: return "SPELL_AURA_MOD_ATTACK_POWER_PCT"; + case SPELL_AURA_MOD_RANGED_ATTACK_POWER_PCT: return "SPELL_AURA_MOD_RANGED_ATTACK_POWER_PCT"; + case SPELL_AURA_MOD_DAMAGE_DONE_VERSUS: return "SPELL_AURA_MOD_DAMAGE_DONE_VERSUS"; + case SPELL_AURA_MOD_CRIT_PERCENT_VERSUS: return "SPELL_AURA_MOD_CRIT_PERCENT_VERSUS"; + case SPELL_AURA_DETECT_AMORE: return "SPELL_AURA_DETECT_AMORE"; + case SPELL_AURA_MOD_SPEED_NOT_STACK: return "SPELL_AURA_MOD_SPEED_NOT_STACK"; + case SPELL_AURA_MOD_MOUNTED_SPEED_NOT_STACK: return "SPELL_AURA_MOD_MOUNTED_SPEED_NOT_STACK"; + case SPELL_AURA_173: return "SPELL_AURA_173"; + case SPELL_AURA_MOD_SPELL_DAMAGE_OF_STAT_PERCENT: return "SPELL_AURA_MOD_SPELL_DAMAGE_OF_STAT_PERCENT"; + case SPELL_AURA_MOD_SPELL_HEALING_OF_STAT_PERCENT: return "SPELL_AURA_MOD_SPELL_HEALING_OF_STAT_PERCENT"; + case SPELL_AURA_SPIRIT_OF_REDEMPTION: return "SPELL_AURA_SPIRIT_OF_REDEMPTION"; + case SPELL_AURA_AOE_CHARM: return "SPELL_AURA_AOE_CHARM"; + case SPELL_AURA_MOD_DEBUFF_RESISTANCE: return "SPELL_AURA_MOD_DEBUFF_RESISTANCE"; + case SPELL_AURA_MOD_ATTACKER_SPELL_CRIT_CHANCE: return "SPELL_AURA_MOD_ATTACKER_SPELL_CRIT_CHANCE"; + case SPELL_AURA_MOD_FLAT_SPELL_DAMAGE_VERSUS: return "SPELL_AURA_MOD_FLAT_SPELL_DAMAGE_VERSUS"; + case SPELL_AURA_181: return "SPELL_AURA_181"; + case SPELL_AURA_MOD_RESISTANCE_OF_STAT_PERCENT: return "SPELL_AURA_MOD_RESISTANCE_OF_STAT_PERCENT"; + case SPELL_AURA_MOD_CRITICAL_THREAT: return "SPELL_AURA_MOD_CRITICAL_THREAT"; + case SPELL_AURA_MOD_ATTACKER_MELEE_HIT_CHANCE: return "SPELL_AURA_MOD_ATTACKER_MELEE_HIT_CHANCE"; + case SPELL_AURA_MOD_ATTACKER_RANGED_HIT_CHANCE: return "SPELL_AURA_MOD_ATTACKER_RANGED_HIT_CHANCE"; + case SPELL_AURA_MOD_ATTACKER_SPELL_HIT_CHANCE: return "SPELL_AURA_MOD_ATTACKER_SPELL_HIT_CHANCE"; + case SPELL_AURA_MOD_ATTACKER_MELEE_CRIT_CHANCE: return "SPELL_AURA_MOD_ATTACKER_MELEE_CRIT_CHANCE"; + case SPELL_AURA_MOD_ATTACKER_RANGED_CRIT_CHANCE: return "SPELL_AURA_MOD_ATTACKER_RANGED_CRIT_CHANCE"; + case SPELL_AURA_MOD_RATING: return "SPELL_AURA_MOD_RATING"; + case SPELL_AURA_MOD_FACTION_REPUTATION_GAIN: return "SPELL_AURA_MOD_FACTION_REPUTATION_GAIN"; + case SPELL_AURA_USE_NORMAL_MOVEMENT_SPEED: return "SPELL_AURA_USE_NORMAL_MOVEMENT_SPEED"; + case SPELL_AURA_MOD_MELEE_RANGED_HASTE: return "SPELL_AURA_MOD_MELEE_RANGED_HASTE"; + case SPELL_AURA_MELEE_SLOW: return "SPELL_AURA_MELEE_SLOW"; + case SPELL_AURA_MOD_TARGET_ABSORB_SCHOOL: return "SPELL_AURA_MOD_TARGET_ABSORB_SCHOOL"; + case SPELL_AURA_MOD_TARGET_ABILITY_ABSORB_SCHOOL: return "SPELL_AURA_MOD_TARGET_ABILITY_ABSORB_SCHOOL"; + case SPELL_AURA_MOD_COOLDOWN: return "SPELL_AURA_MOD_COOLDOWN"; + case SPELL_AURA_MOD_ATTACKER_SPELL_AND_WEAPON_CRIT_CHANCE: return "SPELL_AURA_MOD_ATTACKER_SPELL_AND_WEAPON_CRIT_CHANCE"; + case SPELL_AURA_198: return "SPELL_AURA_198"; + case SPELL_AURA_MOD_INCREASES_SPELL_PCT_TO_HIT: return "SPELL_AURA_MOD_INCREASES_SPELL_PCT_TO_HIT"; + case SPELL_AURA_MOD_XP_PCT: return "SPELL_AURA_MOD_XP_PCT"; + case SPELL_AURA_FLY: return "SPELL_AURA_FLY"; + case SPELL_AURA_IGNORE_COMBAT_RESULT: return "SPELL_AURA_IGNORE_COMBAT_RESULT"; + case SPELL_AURA_MOD_ATTACKER_MELEE_CRIT_DAMAGE: return "SPELL_AURA_MOD_ATTACKER_MELEE_CRIT_DAMAGE"; + case SPELL_AURA_MOD_ATTACKER_RANGED_CRIT_DAMAGE: return "SPELL_AURA_MOD_ATTACKER_RANGED_CRIT_DAMAGE"; + case SPELL_AURA_MOD_SCHOOL_CRIT_DMG_TAKEN: return "SPELL_AURA_MOD_SCHOOL_CRIT_DMG_TAKEN"; + case SPELL_AURA_MOD_INCREASE_FLIGHT_SPEED: return "SPELL_AURA_MOD_INCREASE_FLIGHT_SPEED"; + case SPELL_AURA_MOD_INCREASE_MOUNTED_FLIGHT_SPEED: return "SPELL_AURA_MOD_INCREASE_MOUNTED_FLIGHT_SPEED"; + case SPELL_AURA_MOD_FLIGHT_SPEED_ALWAYS: return "SPELL_AURA_MOD_FLIGHT_SPEED_ALWAYS"; + case SPELL_AURA_MOD_MOUNTED_FLIGHT_SPEED_ALWAYS: return "SPELL_AURA_MOD_MOUNTED_FLIGHT_SPEED_ALWAYS"; + case SPELL_AURA_MOD_FLIGHT_SPEED_NOT_STACKING: return "SPELL_AURA_MOD_FLIGHT_SPEED_NOT_STACKING"; + case SPELL_AURA_MOD_FLIGHT_SPEED_MOUNTED_NOT_STACKING: return "SPELL_AURA_MOD_FLIGHT_SPEED_MOUNTED_NOT_STACKING"; + case SPELL_AURA_MOD_RANGED_ATTACK_POWER_OF_STAT_PERCENT: return "SPELL_AURA_MOD_RANGED_ATTACK_POWER_OF_STAT_PERCENT"; + case SPELL_AURA_MOD_RAGE_FROM_DAMAGE_DEALT: return "SPELL_AURA_MOD_RAGE_FROM_DAMAGE_DEALT"; + case SPELL_AURA_214: return "SPELL_AURA_214"; + case SPELL_AURA_ARENA_PREPARATION: return "SPELL_AURA_ARENA_PREPARATION"; + case SPELL_AURA_HASTE_SPELLS: return "SPELL_AURA_HASTE_SPELLS"; + case SPELL_AURA_MOD_MELEE_HASTE_2: return "SPELL_AURA_MOD_MELEE_HASTE_2"; + case SPELL_AURA_HASTE_RANGED: return "SPELL_AURA_HASTE_RANGED"; + case SPELL_AURA_MOD_MANA_REGEN_FROM_STAT: return "SPELL_AURA_MOD_MANA_REGEN_FROM_STAT"; + case SPELL_AURA_MOD_RATING_FROM_STAT: return "SPELL_AURA_MOD_RATING_FROM_STAT"; + case SPELL_AURA_IGNORED: return "SPELL_AURA_IGNORED"; + case SPELL_AURA_222: return "SPELL_AURA_222"; + case SPELL_AURA_RAID_PROC_FROM_CHARGE: return "SPELL_AURA_RAID_PROC_FROM_CHARGE"; + case SPELL_AURA_224: return "SPELL_AURA_224"; + case SPELL_AURA_RAID_PROC_FROM_CHARGE_WITH_VALUE: return "SPELL_AURA_RAID_PROC_FROM_CHARGE_WITH_VALUE"; + case SPELL_AURA_PERIODIC_DUMMY: return "SPELL_AURA_PERIODIC_DUMMY"; + case SPELL_AURA_PERIODIC_TRIGGER_SPELL_WITH_VALUE: return "SPELL_AURA_PERIODIC_TRIGGER_SPELL_WITH_VALUE"; + case SPELL_AURA_DETECT_STEALTH: return "SPELL_AURA_DETECT_STEALTH"; + case SPELL_AURA_MOD_AOE_DAMAGE_AVOIDANCE: return "SPELL_AURA_MOD_AOE_DAMAGE_AVOIDANCE"; + case SPELL_AURA_230: return "SPELL_AURA_230"; + case SPELL_AURA_PROC_TRIGGER_SPELL_WITH_VALUE: return "SPELL_AURA_PROC_TRIGGER_SPELL_WITH_VALUE"; + case SPELL_AURA_MECHANIC_DURATION_MOD: return "SPELL_AURA_MECHANIC_DURATION_MOD"; + case SPELL_AURA_CHANGE_MODEL_FOR_ALL_HUMANOIDS: return "SPELL_AURA_CHANGE_MODEL_FOR_ALL_HUMANOIDS"; + case SPELL_AURA_MECHANIC_DURATION_MOD_NOT_STACK: return "SPELL_AURA_MECHANIC_DURATION_MOD_NOT_STACK"; + case SPELL_AURA_MOD_DISPEL_RESIST: return "SPELL_AURA_MOD_DISPEL_RESIST"; + case SPELL_AURA_CONTROL_VEHICLE: return "SPELL_AURA_CONTROL_VEHICLE"; + case SPELL_AURA_MOD_SPELL_DAMAGE_OF_ATTACK_POWER: return "SPELL_AURA_MOD_SPELL_DAMAGE_OF_ATTACK_POWER"; + case SPELL_AURA_MOD_SPELL_HEALING_OF_ATTACK_POWER: return "SPELL_AURA_MOD_SPELL_HEALING_OF_ATTACK_POWER"; + case SPELL_AURA_MOD_SCALE_2: return "SPELL_AURA_MOD_SCALE_2"; + case SPELL_AURA_MOD_EXPERTISE: return "SPELL_AURA_MOD_EXPERTISE"; + case SPELL_AURA_FORCE_MOVE_FORWARD: return "SPELL_AURA_FORCE_MOVE_FORWARD"; + case SPELL_AURA_MOD_SPELL_DAMAGE_FROM_HEALING: return "SPELL_AURA_MOD_SPELL_DAMAGE_FROM_HEALING"; + case SPELL_AURA_MOD_FACTION: return "SPELL_AURA_MOD_FACTION"; + case SPELL_AURA_COMPREHEND_LANGUAGE: return "SPELL_AURA_COMPREHEND_LANGUAGE"; + case SPELL_AURA_MOD_AURA_DURATION_BY_DISPEL: return "SPELL_AURA_MOD_AURA_DURATION_BY_DISPEL"; + case SPELL_AURA_MOD_AURA_DURATION_BY_DISPEL_NOT_STACK: return "SPELL_AURA_MOD_AURA_DURATION_BY_DISPEL_NOT_STACK"; + case SPELL_AURA_CLONE_CASTER: return "SPELL_AURA_CLONE_CASTER"; + case SPELL_AURA_MOD_COMBAT_RESULT_CHANCE: return "SPELL_AURA_MOD_COMBAT_RESULT_CHANCE"; + case SPELL_AURA_CONVERT_RUNE: return "SPELL_AURA_CONVERT_RUNE"; + case SPELL_AURA_MOD_INCREASE_HEALTH_2: return "SPELL_AURA_MOD_INCREASE_HEALTH_2"; + case SPELL_AURA_MOD_ENEMY_DODGE: return "SPELL_AURA_MOD_ENEMY_DODGE"; + case SPELL_AURA_MOD_SPEED_SLOW_ALL: return "SPELL_AURA_MOD_SPEED_SLOW_ALL"; + case SPELL_AURA_MOD_BLOCK_CRIT_CHANCE: return "SPELL_AURA_MOD_BLOCK_CRIT_CHANCE"; + case SPELL_AURA_MOD_DISARM_OFFHAND: return "SPELL_AURA_MOD_DISARM_OFFHAND"; + case SPELL_AURA_MOD_MECHANIC_DAMAGE_TAKEN_PERCENT: return "SPELL_AURA_MOD_MECHANIC_DAMAGE_TAKEN_PERCENT"; + case SPELL_AURA_NO_REAGENT_USE: return "SPELL_AURA_NO_REAGENT_USE"; + case SPELL_AURA_MOD_TARGET_RESIST_BY_SPELL_CLASS: return "SPELL_AURA_MOD_TARGET_RESIST_BY_SPELL_CLASS"; + case SPELL_AURA_258: return "SPELL_AURA_258"; + case SPELL_AURA_MOD_HOT_PCT: return "SPELL_AURA_MOD_HOT_PCT"; + case SPELL_AURA_SCREEN_EFFECT: return "SPELL_AURA_SCREEN_EFFECT"; + case SPELL_AURA_PHASE: return "SPELL_AURA_PHASE"; + case SPELL_AURA_ABILITY_IGNORE_AURASTATE: return "SPELL_AURA_ABILITY_IGNORE_AURASTATE"; + case SPELL_AURA_ALLOW_ONLY_ABILITY: return "SPELL_AURA_ALLOW_ONLY_ABILITY"; + case SPELL_AURA_264: return "SPELL_AURA_264"; + case SPELL_AURA_265: return "SPELL_AURA_265"; + case SPELL_AURA_266: return "SPELL_AURA_266"; + case SPELL_AURA_MOD_IMMUNE_AURA_APPLY_SCHOOL: return "SPELL_AURA_MOD_IMMUNE_AURA_APPLY_SCHOOL"; + case SPELL_AURA_MOD_ATTACK_POWER_OF_STAT_PERCENT: return "SPELL_AURA_MOD_ATTACK_POWER_OF_STAT_PERCENT"; + case SPELL_AURA_MOD_IGNORE_TARGET_RESIST: return "SPELL_AURA_MOD_IGNORE_TARGET_RESIST"; + case SPELL_AURA_MOD_ABILITY_IGNORE_TARGET_RESIST: return "SPELL_AURA_MOD_ABILITY_IGNORE_TARGET_RESIST"; + case SPELL_AURA_MOD_DAMAGE_FROM_CASTER: return "SPELL_AURA_MOD_DAMAGE_FROM_CASTER"; + case SPELL_AURA_IGNORE_MELEE_RESET: return "SPELL_AURA_IGNORE_MELEE_RESET"; + case SPELL_AURA_X_RAY: return "SPELL_AURA_X_RAY"; + case SPELL_AURA_ABILITY_CONSUME_NO_AMMO: return "SPELL_AURA_ABILITY_CONSUME_NO_AMMO"; + case SPELL_AURA_MOD_IGNORE_SHAPESHIFT: return "SPELL_AURA_MOD_IGNORE_SHAPESHIFT"; + case SPELL_AURA_MOD_DAMAGE_DONE_FOR_MECHANIC: return "SPELL_AURA_MOD_DAMAGE_DONE_FOR_MECHANIC"; + case SPELL_AURA_MOD_MAX_AFFECTED_TARGETS: return "SPELL_AURA_MOD_MAX_AFFECTED_TARGETS"; + case SPELL_AURA_MOD_DISARM_RANGED: return "SPELL_AURA_MOD_DISARM_RANGED"; + case SPELL_AURA_INITIALIZE_IMAGES: return "SPELL_AURA_INITIALIZE_IMAGES"; + case SPELL_AURA_MOD_ARMOR_PENETRATION_PCT: return "SPELL_AURA_MOD_ARMOR_PENETRATION_PCT"; + case SPELL_AURA_MOD_HONOR_GAIN_PCT: return "SPELL_AURA_MOD_HONOR_GAIN_PCT"; + case SPELL_AURA_MOD_BASE_HEALTH_PCT: return "SPELL_AURA_MOD_BASE_HEALTH_PCT"; + case SPELL_AURA_MOD_HEALING_RECEIVED: return "SPELL_AURA_MOD_HEALING_RECEIVED"; + case SPELL_AURA_LINKED: return "SPELL_AURA_LINKED"; + case SPELL_AURA_MOD_ATTACK_POWER_OF_ARMOR: return "SPELL_AURA_MOD_ATTACK_POWER_OF_ARMOR"; + case SPELL_AURA_ABILITY_PERIODIC_CRIT: return "SPELL_AURA_ABILITY_PERIODIC_CRIT"; + case SPELL_AURA_DEFLECT_SPELLS: return "SPELL_AURA_DEFLECT_SPELLS"; + case SPELL_AURA_IGNORE_HIT_DIRECTION: return "SPELL_AURA_IGNORE_HIT_DIRECTION"; + case SPELL_AURA_PREVENT_DURABILITY_LOSS: return "SPELL_AURA_PREVENT_DURABILITY_LOSS"; + case SPELL_AURA_MOD_CRIT_PCT: return "SPELL_AURA_MOD_CRIT_PCT"; + case SPELL_AURA_MOD_XP_QUEST_PCT: return "SPELL_AURA_MOD_XP_QUEST_PCT"; + case SPELL_AURA_OPEN_STABLE: return "SPELL_AURA_OPEN_STABLE"; + case SPELL_AURA_OVERRIDE_SPELLS: return "SPELL_AURA_OVERRIDE_SPELLS"; + case SPELL_AURA_PREVENT_REGENERATE_POWER: return "SPELL_AURA_PREVENT_REGENERATE_POWER"; + case SPELL_AURA_295: return "SPELL_AURA_295"; + case SPELL_AURA_SET_VEHICLE_ID: return "SPELL_AURA_SET_VEHICLE_ID"; + case SPELL_AURA_BLOCK_SPELL_FAMILY: return "SPELL_AURA_BLOCK_SPELL_FAMILY"; + case SPELL_AURA_STRANGULATE: return "SPELL_AURA_STRANGULATE"; + case SPELL_AURA_299: return "SPELL_AURA_299"; + case SPELL_AURA_SHARE_DAMAGE_PCT: return "SPELL_AURA_SHARE_DAMAGE_PCT"; + case SPELL_AURA_SCHOOL_HEAL_ABSORB: return "SPELL_AURA_SCHOOL_HEAL_ABSORB"; + case SPELL_AURA_302: return "SPELL_AURA_302"; + case SPELL_AURA_MOD_DAMAGE_DONE_VERSUS_AURASTATE: return "SPELL_AURA_MOD_DAMAGE_DONE_VERSUS_AURASTATE"; + case SPELL_AURA_MOD_FAKE_INEBRIATE: return "SPELL_AURA_MOD_FAKE_INEBRIATE"; + case SPELL_AURA_MOD_MINIMUM_SPEED: return "SPELL_AURA_MOD_MINIMUM_SPEED"; + case SPELL_AURA_306: return "SPELL_AURA_306"; + case SPELL_AURA_HEAL_ABSORB_TEST: return "SPELL_AURA_HEAL_ABSORB_TEST"; + case SPELL_AURA_MOD_CRIT_CHANCE_FOR_CASTER: return "SPELL_AURA_MOD_CRIT_CHANCE_FOR_CASTER"; + case SPELL_AURA_309: return "SPELL_AURA_309"; + case SPELL_AURA_MOD_CREATURE_AOE_DAMAGE_AVOIDANCE: return "SPELL_AURA_MOD_CREATURE_AOE_DAMAGE_AVOIDANCE"; + case SPELL_AURA_311: return "SPELL_AURA_311"; + case SPELL_AURA_312: return "SPELL_AURA_312"; + case SPELL_AURA_313: return "SPELL_AURA_313"; + case SPELL_AURA_PREVENT_RESURRECTION: return "SPELL_AURA_PREVENT_RESURRECTION"; + case SPELL_AURA_UNDERWATER_WALKING: return "SPELL_AURA_UNDERWATER_WALKING"; + case SPELL_AURA_PERIODIC_HASTE: return "SPELL_AURA_PERIODIC_HASTE"; + default: return "UNKNOWN_AURA"; + } + } + + static char const* GetTargetName(uint32 target) + { + switch (target) + { + case TARGET_UNIT_CASTER: return "TARGET_UNIT_CASTER"; + case TARGET_UNIT_NEARBY_ENEMY: return "TARGET_UNIT_NEARBY_ENEMY"; + case TARGET_UNIT_NEARBY_ALLY: return "TARGET_UNIT_NEARBY_ALLY"; + case TARGET_UNIT_NEARBY_PARTY: return "TARGET_UNIT_NEARBY_PARTY"; + case TARGET_UNIT_PET: return "TARGET_UNIT_PET"; + case TARGET_UNIT_TARGET_ENEMY: return "TARGET_UNIT_TARGET_ENEMY"; + case TARGET_UNIT_SRC_AREA_ENTRY: return "TARGET_UNIT_SRC_AREA_ENTRY"; + case TARGET_UNIT_DEST_AREA_ENTRY: return "TARGET_UNIT_DEST_AREA_ENTRY"; + case TARGET_DEST_HOME: return "TARGET_DEST_HOME"; + case TARGET_UNIT_SRC_AREA_UNK_11: return "TARGET_UNIT_SRC_AREA_UNK_11"; + case TARGET_UNIT_SRC_AREA_ENEMY: return "TARGET_UNIT_SRC_AREA_ENEMY"; + case TARGET_UNIT_DEST_AREA_ENEMY: return "TARGET_UNIT_DEST_AREA_ENEMY"; + case TARGET_DEST_DB: return "TARGET_DEST_DB"; + case TARGET_DEST_CASTER: return "TARGET_DEST_CASTER"; + case TARGET_UNIT_CASTER_AREA_PARTY: return "TARGET_UNIT_CASTER_AREA_PARTY"; + case TARGET_UNIT_TARGET_ALLY: return "TARGET_UNIT_TARGET_ALLY"; + case TARGET_SRC_CASTER: return "TARGET_SRC_CASTER"; + case TARGET_GAMEOBJECT_TARGET: return "TARGET_GAMEOBJECT_TARGET"; + case TARGET_UNIT_CONE_ENEMY_24: return "TARGET_UNIT_CONE_ENEMY_24"; + case TARGET_UNIT_TARGET_ANY: return "TARGET_UNIT_TARGET_ANY"; + case TARGET_GAMEOBJECT_ITEM_TARGET: return "TARGET_GAMEOBJECT_ITEM_TARGET"; + case TARGET_UNIT_MASTER: return "TARGET_UNIT_MASTER"; + case TARGET_DEST_DYNOBJ_ENEMY: return "TARGET_DEST_DYNOBJ_ENEMY"; + case TARGET_DEST_DYNOBJ_ALLY: return "TARGET_DEST_DYNOBJ_ALLY"; + case TARGET_UNIT_SRC_AREA_ALLY: return "TARGET_UNIT_SRC_AREA_ALLY"; + case TARGET_UNIT_DEST_AREA_ALLY: return "TARGET_UNIT_DEST_AREA_ALLY"; + case TARGET_DEST_CASTER_SUMMON: return "TARGET_DEST_CASTER_SUMMON"; + case TARGET_UNIT_SRC_AREA_PARTY: return "TARGET_UNIT_SRC_AREA_PARTY"; + case TARGET_UNIT_DEST_AREA_PARTY: return "TARGET_UNIT_DEST_AREA_PARTY"; + case TARGET_UNIT_TARGET_PARTY: return "TARGET_UNIT_TARGET_PARTY"; + case TARGET_DEST_CASTER_36: return "TARGET_DEST_CASTER_36"; + case TARGET_UNIT_LASTTARGET_AREA_PARTY: return "TARGET_UNIT_LASTTARGET_AREA_PARTY"; + case TARGET_UNIT_NEARBY_ENTRY: return "TARGET_UNIT_NEARBY_ENTRY"; + case TARGET_DEST_CASTER_FISHING: return "TARGET_DEST_CASTER_FISHING"; + case TARGET_GAMEOBJECT_NEARBY_ENTRY: return "TARGET_GAMEOBJECT_NEARBY_ENTRY"; + case TARGET_DEST_CASTER_FRONT_RIGHT: return "TARGET_DEST_CASTER_FRONT_RIGHT"; + case TARGET_DEST_CASTER_BACK_RIGHT: return "TARGET_DEST_CASTER_BACK_RIGHT"; + case TARGET_DEST_CASTER_BACK_LEFT: return "TARGET_DEST_CASTER_BACK_LEFT"; + case TARGET_DEST_CASTER_FRONT_LEFT: return "TARGET_DEST_CASTER_FRONT_LEFT"; + case TARGET_UNIT_TARGET_CHAINHEAL_ALLY: return "TARGET_UNIT_TARGET_CHAINHEAL_ALLY"; + case TARGET_DEST_NEARBY_ENTRY: return "TARGET_DEST_NEARBY_ENTRY"; + case TARGET_DEST_CASTER_FRONT: return "TARGET_DEST_CASTER_FRONT"; + case TARGET_DEST_CASTER_BACK: return "TARGET_DEST_CASTER_BACK"; + case TARGET_DEST_CASTER_RIGHT: return "TARGET_DEST_CASTER_RIGHT"; + case TARGET_DEST_CASTER_LEFT: return "TARGET_DEST_CASTER_LEFT"; + case TARGET_GAMEOBJECT_SRC_AREA: return "TARGET_GAMEOBJECT_SRC_AREA"; + case TARGET_GAMEOBJECT_DEST_AREA: return "TARGET_GAMEOBJECT_DEST_AREA"; + case TARGET_DEST_TARGET_ENEMY: return "TARGET_DEST_TARGET_ENEMY"; + case TARGET_UNIT_CONE_ENEMY_54: return "TARGET_UNIT_CONE_ENEMY_54"; + case TARGET_DEST_CASTER_FRONT_LEAP: return "TARGET_DEST_CASTER_FRONT_LEAP"; + case TARGET_UNIT_CASTER_AREA_RAID: return "TARGET_UNIT_CASTER_AREA_RAID"; + case TARGET_UNIT_TARGET_RAID: return "TARGET_UNIT_TARGET_RAID"; + case TARGET_UNIT_NEARBY_RAID: return "TARGET_UNIT_NEARBY_RAID"; + case TARGET_UNIT_CONE_ALLY: return "TARGET_UNIT_CONE_ALLY"; + case TARGET_UNIT_CONE_ENTRY: return "TARGET_UNIT_CONE_ENTRY"; + case TARGET_UNIT_TARGET_AREA_RAID_CLASS: return "TARGET_UNIT_TARGET_AREA_RAID_CLASS"; + case TARGET_UNK_62: return "TARGET_UNK_62"; + case TARGET_DEST_TARGET_ANY: return "TARGET_DEST_TARGET_ANY"; + case TARGET_DEST_TARGET_FRONT: return "TARGET_DEST_TARGET_FRONT"; + case TARGET_DEST_TARGET_BACK: return "TARGET_DEST_TARGET_BACK"; + case TARGET_DEST_TARGET_RIGHT: return "TARGET_DEST_TARGET_RIGHT"; + case TARGET_DEST_TARGET_LEFT: return "TARGET_DEST_TARGET_LEFT"; + case TARGET_DEST_TARGET_FRONT_RIGHT: return "TARGET_DEST_TARGET_FRONT_RIGHT"; + case TARGET_DEST_TARGET_BACK_RIGHT: return "TARGET_DEST_TARGET_BACK_RIGHT"; + case TARGET_DEST_TARGET_BACK_LEFT: return "TARGET_DEST_TARGET_BACK_LEFT"; + case TARGET_DEST_TARGET_FRONT_LEFT: return "TARGET_DEST_TARGET_FRONT_LEFT"; + case TARGET_DEST_CASTER_RANDOM: return "TARGET_DEST_CASTER_RANDOM"; + case TARGET_DEST_CASTER_RADIUS: return "TARGET_DEST_CASTER_RADIUS"; + case TARGET_DEST_TARGET_RANDOM: return "TARGET_DEST_TARGET_RANDOM"; + case TARGET_DEST_TARGET_RADIUS: return "TARGET_DEST_TARGET_RADIUS"; + case TARGET_DEST_CHANNEL_TARGET: return "TARGET_DEST_CHANNEL_TARGET"; + case TARGET_UNIT_CHANNEL_TARGET: return "TARGET_UNIT_CHANNEL_TARGET"; + case TARGET_DEST_DEST_FRONT: return "TARGET_DEST_DEST_FRONT"; + case TARGET_DEST_DEST_BACK: return "TARGET_DEST_DEST_BACK"; + case TARGET_DEST_DEST_RIGHT: return "TARGET_DEST_DEST_RIGHT"; + case TARGET_DEST_DEST_LEFT: return "TARGET_DEST_DEST_LEFT"; + case TARGET_DEST_DEST_FRONT_RIGHT: return "TARGET_DEST_DEST_FRONT_RIGHT"; + case TARGET_DEST_DEST_BACK_RIGHT: return "TARGET_DEST_DEST_BACK_RIGHT"; + case TARGET_DEST_DEST_BACK_LEFT: return "TARGET_DEST_DEST_BACK_LEFT"; + case TARGET_DEST_DEST_FRONT_LEFT: return "TARGET_DEST_DEST_FRONT_LEFT"; + case TARGET_DEST_DEST_RANDOM: return "TARGET_DEST_DEST_RANDOM"; + case TARGET_DEST_DEST: return "TARGET_DEST_DEST"; + case TARGET_DEST_DYNOBJ_NONE: return "TARGET_DEST_DYNOBJ_NONE"; + case TARGET_DEST_TRAJ: return "TARGET_DEST_TRAJ"; + case TARGET_UNIT_TARGET_MINIPET: return "TARGET_UNIT_TARGET_MINIPET"; + case TARGET_DEST_DEST_RADIUS: return "TARGET_DEST_DEST_RADIUS"; + case TARGET_UNIT_SUMMONER: return "TARGET_UNIT_SUMMONER"; + case TARGET_CORPSE_SRC_AREA_ENEMY: return "TARGET_CORPSE_SRC_AREA_ENEMY"; + case TARGET_UNIT_VEHICLE: return "TARGET_UNIT_VEHICLE"; + case TARGET_UNIT_TARGET_PASSENGER: return "TARGET_UNIT_TARGET_PASSENGER"; + case TARGET_UNIT_PASSENGER_0: return "TARGET_UNIT_PASSENGER_0"; + case TARGET_UNIT_PASSENGER_1: return "TARGET_UNIT_PASSENGER_1"; + case TARGET_UNIT_PASSENGER_2: return "TARGET_UNIT_PASSENGER_2"; + case TARGET_UNIT_PASSENGER_3: return "TARGET_UNIT_PASSENGER_3"; + case TARGET_UNIT_PASSENGER_4: return "TARGET_UNIT_PASSENGER_4"; + case TARGET_UNIT_PASSENGER_5: return "TARGET_UNIT_PASSENGER_5"; + case TARGET_UNIT_PASSENGER_6: return "TARGET_UNIT_PASSENGER_6"; + case TARGET_UNIT_PASSENGER_7: return "TARGET_UNIT_PASSENGER_7"; + case TARGET_UNIT_CONE_ENEMY_104: return "TARGET_UNIT_CONE_ENEMY_104"; + case TARGET_UNIT_UNK_105: return "TARGET_UNIT_UNK_105"; + case TARGET_DEST_CHANNEL_CASTER: return "TARGET_DEST_CHANNEL_CASTER"; + case TARGET_UNK_DEST_AREA_UNK_107: return "TARGET_UNK_DEST_AREA_UNK_107"; + case TARGET_GAMEOBJECT_CONE: return "TARGET_GAMEOBJECT_CONE"; + case TARGET_DEST_UNK_110: return "TARGET_DEST_UNK_110"; + default: return "TARGET_NONE"; + } + } + + static char const* GetDispelName(uint32 dispel) + { + switch (dispel) + { + case DISPEL_NONE: return "DISPEL_NONE"; + case DISPEL_MAGIC: return "DISPEL_MAGIC"; + case DISPEL_CURSE: return "DISPEL_CURSE"; + case DISPEL_DISEASE: return "DISPEL_DISEASE"; + case DISPEL_POISON: return "DISPEL_POISON"; + case DISPEL_STEALTH: return "DISPEL_STEALTH"; + case DISPEL_INVISIBILITY: return "DISPEL_INVISIBILITY"; + case DISPEL_ALL: return "DISPEL_ALL"; + case DISPEL_SPE_NPC_ONLY: return "DISPEL_SPE_NPC_ONLY"; + case DISPEL_ENRAGE: return "DISPEL_ENRAGE"; + case DISPEL_ZG_TICKET: return "DISPEL_ZG_TICKET"; + case DESPEL_OLD_UNUSED: return "DESPEL_OLD_UNUSED"; + default: return "UNKNOWN_DISPEL"; + } + } + + static char const* GetPowerName(uint32 power) + { + switch (power) + { + case POWER_MANA: return "POWER_MANA"; + case POWER_RAGE: return "POWER_RAGE"; + case POWER_FOCUS: return "POWER_FOCUS"; + case POWER_ENERGY: return "POWER_ENERGY"; + case POWER_HAPPINESS: return "POWER_HAPPINESS"; + case POWER_RUNE: return "POWER_RUNE"; + case POWER_RUNIC_POWER: return "POWER_RUNIC_POWER"; + case POWER_HEALTH: return "POWER_HEALTH"; + default: return "UNKNOWN_POWER"; + } + } + + static char const* GetDmgClassName(uint32 dmgClass) + { + switch (dmgClass) + { + case SPELL_DAMAGE_CLASS_NONE: return "SPELL_DAMAGE_CLASS_NONE"; + case SPELL_DAMAGE_CLASS_MAGIC: return "SPELL_DAMAGE_CLASS_MAGIC"; + case SPELL_DAMAGE_CLASS_MELEE: return "SPELL_DAMAGE_CLASS_MELEE"; + case SPELL_DAMAGE_CLASS_RANGED: return "SPELL_DAMAGE_CLASS_RANGED"; + default: return "UNKNOWN_DMG_CLASS"; + } + } + + static char const* GetPreventionTypeName(uint32 type) + { + switch (type) + { + case SPELL_PREVENTION_TYPE_NONE: return "SPELL_PREVENTION_TYPE_NONE"; + case SPELL_PREVENTION_TYPE_SILENCE: return "SPELL_PREVENTION_TYPE_SILENCE"; + case SPELL_PREVENTION_TYPE_PACIFY: return "SPELL_PREVENTION_TYPE_PACIFY"; + default: return "UNKNOWN_PREVENTION_TYPE"; + } + } + + static char const* GetSpellFamilyName(uint32 family) + { + switch (family) + { + case SPELLFAMILY_GENERIC: return "SPELLFAMILY_GENERIC"; + case SPELLFAMILY_UNK1: return "SPELLFAMILY_UNK1"; + case SPELLFAMILY_MAGE: return "SPELLFAMILY_MAGE"; + case SPELLFAMILY_WARRIOR: return "SPELLFAMILY_WARRIOR"; + case SPELLFAMILY_WARLOCK: return "SPELLFAMILY_WARLOCK"; + case SPELLFAMILY_PRIEST: return "SPELLFAMILY_PRIEST"; + case SPELLFAMILY_DRUID: return "SPELLFAMILY_DRUID"; + case SPELLFAMILY_ROGUE: return "SPELLFAMILY_ROGUE"; + case SPELLFAMILY_HUNTER: return "SPELLFAMILY_HUNTER"; + case SPELLFAMILY_PALADIN: return "SPELLFAMILY_PALADIN"; + case SPELLFAMILY_SHAMAN: return "SPELLFAMILY_SHAMAN"; + case SPELLFAMILY_UNK2: return "SPELLFAMILY_UNK2"; + case SPELLFAMILY_POTION: return "SPELLFAMILY_POTION"; + case SPELLFAMILY_DEATHKNIGHT: return "SPELLFAMILY_DEATHKNIGHT"; + case SPELLFAMILY_PET: return "SPELLFAMILY_PET"; + default: return "UNKNOWN_FAMILY"; + } + } + + template + static void PrintSpellAttrFlags(ChatHandler* handler, char const* label, uint32 flags) + { + handler->PSendSysMessage("{}: 0x{:08X}", label, flags); + for (auto attr : EnumUtils::Iterate()) + if (flags & static_cast(attr)) + handler->PSendSysMessage(" - {}", EnumUtils::ToConstant(attr)); + } + + static void PrintBasicInfo(ChatHandler* handler, SpellInfo const* spell) + { + int locale = handler->GetSessionDbcLocale(); + + handler->PSendSysMessage("ID: {}", spell->Id); + handler->PSendSysMessage("Name: {}", spell->SpellName[locale]); + if (spell->Rank[locale] && spell->Rank[locale][0] != '\0') + handler->PSendSysMessage("Rank: {}", spell->Rank[locale]); + + handler->PSendSysMessage("Dispel: {} ({})", spell->Dispel, GetDispelName(spell->Dispel)); + handler->PSendSysMessage("Mechanic: {} ({})", spell->Mechanic, EnumUtils::ToConstant(static_cast(spell->Mechanic))); + } + + static void PrintAttributes(ChatHandler* handler, SpellInfo const* spell) + { + PrintSpellAttrFlags(handler, "Attributes", spell->Attributes); + PrintSpellAttrFlags(handler, "AttributesEx", spell->AttributesEx); + PrintSpellAttrFlags(handler, "AttributesEx2", spell->AttributesEx2); + PrintSpellAttrFlags(handler, "AttributesEx3", spell->AttributesEx3); + PrintSpellAttrFlags(handler, "AttributesEx4", spell->AttributesEx4); + PrintSpellAttrFlags(handler, "AttributesEx5", spell->AttributesEx5); + PrintSpellAttrFlags(handler, "AttributesEx6", spell->AttributesEx6); + PrintSpellAttrFlags(handler, "AttributesEx7", spell->AttributesEx7); + + handler->PSendSysMessage("AttributesCu: 0x{:08X}", spell->AttributesCu); + if (spell->AttributesCu) + { + if (spell->AttributesCu & SPELL_ATTR0_CU_ENCHANT_PROC) handler->PSendSysMessage(" - SPELL_ATTR0_CU_ENCHANT_PROC"); + if (spell->AttributesCu & SPELL_ATTR0_CU_CONE_BACK) handler->PSendSysMessage(" - SPELL_ATTR0_CU_CONE_BACK"); + if (spell->AttributesCu & SPELL_ATTR0_CU_CONE_LINE) handler->PSendSysMessage(" - SPELL_ATTR0_CU_CONE_LINE"); + if (spell->AttributesCu & SPELL_ATTR0_CU_SHARE_DAMAGE) handler->PSendSysMessage(" - SPELL_ATTR0_CU_SHARE_DAMAGE"); + if (spell->AttributesCu & SPELL_ATTR0_CU_NO_INITIAL_THREAT) handler->PSendSysMessage(" - SPELL_ATTR0_CU_NO_INITIAL_THREAT"); + if (spell->AttributesCu & SPELL_ATTR0_CU_AURA_CC) handler->PSendSysMessage(" - SPELL_ATTR0_CU_AURA_CC"); + if (spell->AttributesCu & SPELL_ATTR0_CU_DONT_BREAK_STEALTH) handler->PSendSysMessage(" - SPELL_ATTR0_CU_DONT_BREAK_STEALTH"); + if (spell->AttributesCu & SPELL_ATTR0_CU_NO_PVP_FLAG) handler->PSendSysMessage(" - SPELL_ATTR0_CU_NO_PVP_FLAG"); + if (spell->AttributesCu & SPELL_ATTR0_CU_DIRECT_DAMAGE) handler->PSendSysMessage(" - SPELL_ATTR0_CU_DIRECT_DAMAGE"); + if (spell->AttributesCu & SPELL_ATTR0_CU_CHARGE) handler->PSendSysMessage(" - SPELL_ATTR0_CU_CHARGE"); + if (spell->AttributesCu & SPELL_ATTR0_CU_PICKPOCKET) handler->PSendSysMessage(" - SPELL_ATTR0_CU_PICKPOCKET"); + if (spell->AttributesCu & SPELL_ATTR0_CU_IGNORE_EVADE) handler->PSendSysMessage(" - SPELL_ATTR0_CU_IGNORE_EVADE"); + if (spell->AttributesCu & SPELL_ATTR0_CU_NEGATIVE_EFF0) handler->PSendSysMessage(" - SPELL_ATTR0_CU_NEGATIVE_EFF0"); + if (spell->AttributesCu & SPELL_ATTR0_CU_NEGATIVE_EFF1) handler->PSendSysMessage(" - SPELL_ATTR0_CU_NEGATIVE_EFF1"); + if (spell->AttributesCu & SPELL_ATTR0_CU_NEGATIVE_EFF2) handler->PSendSysMessage(" - SPELL_ATTR0_CU_NEGATIVE_EFF2"); + if (spell->AttributesCu & SPELL_ATTR0_CU_IGNORE_ARMOR) handler->PSendSysMessage(" - SPELL_ATTR0_CU_IGNORE_ARMOR"); + if (spell->AttributesCu & SPELL_ATTR0_CU_REQ_TARGET_FACING_CASTER) handler->PSendSysMessage(" - SPELL_ATTR0_CU_REQ_TARGET_FACING_CASTER"); + if (spell->AttributesCu & SPELL_ATTR0_CU_REQ_CASTER_BEHIND_TARGET) handler->PSendSysMessage(" - SPELL_ATTR0_CU_REQ_CASTER_BEHIND_TARGET"); + if (spell->AttributesCu & SPELL_ATTR0_CU_ALLOW_INFLIGHT_TARGET) handler->PSendSysMessage(" - SPELL_ATTR0_CU_ALLOW_INFLIGHT_TARGET"); + if (spell->AttributesCu & SPELL_ATTR0_CU_NEEDS_AMMO_DATA) handler->PSendSysMessage(" - SPELL_ATTR0_CU_NEEDS_AMMO_DATA"); + if (spell->AttributesCu & SPELL_ATTR0_CU_BINARY_SPELL) handler->PSendSysMessage(" - SPELL_ATTR0_CU_BINARY_SPELL"); + if (spell->AttributesCu & SPELL_ATTR0_CU_NO_POSITIVE_TAKEN_BONUS) handler->PSendSysMessage(" - SPELL_ATTR0_CU_NO_POSITIVE_TAKEN_BONUS"); + if (spell->AttributesCu & SPELL_ATTR0_CU_SINGLE_AURA_STACK) handler->PSendSysMessage(" - SPELL_ATTR0_CU_SINGLE_AURA_STACK"); + if (spell->AttributesCu & SPELL_ATTR0_CU_SCHOOLMASK_NORMAL_WITH_MAGIC) handler->PSendSysMessage(" - SPELL_ATTR0_CU_SCHOOLMASK_NORMAL_WITH_MAGIC"); + if (spell->AttributesCu & SPELL_ATTR0_CU_AURA_CANNOT_BE_SAVED) handler->PSendSysMessage(" - SPELL_ATTR0_CU_AURA_CANNOT_BE_SAVED"); + if (spell->AttributesCu & SPELL_ATTR0_CU_POSITIVE_EFF0) handler->PSendSysMessage(" - SPELL_ATTR0_CU_POSITIVE_EFF0"); + if (spell->AttributesCu & SPELL_ATTR0_CU_POSITIVE_EFF1) handler->PSendSysMessage(" - SPELL_ATTR0_CU_POSITIVE_EFF1"); + if (spell->AttributesCu & SPELL_ATTR0_CU_POSITIVE_EFF2) handler->PSendSysMessage(" - SPELL_ATTR0_CU_POSITIVE_EFF2"); + if (spell->AttributesCu & SPELL_ATTR0_CU_FORCE_SEND_CATEGORY_COOLDOWNS) handler->PSendSysMessage(" - SPELL_ATTR0_CU_FORCE_SEND_CATEGORY_COOLDOWNS"); + if (spell->AttributesCu & SPELL_ATTR0_CU_ONLY_ONE_AREA_AURA) handler->PSendSysMessage(" - SPELL_ATTR0_CU_ONLY_ONE_AREA_AURA"); + if (spell->AttributesCu & SPELL_ATTR0_CU_ENCOUNTER_REWARD) handler->PSendSysMessage(" - SPELL_ATTR0_CU_ENCOUNTER_REWARD"); + if (spell->AttributesCu & SPELL_ATTR0_CU_BYPASS_MECHANIC_IMMUNITY) handler->PSendSysMessage(" - SPELL_ATTR0_CU_BYPASS_MECHANIC_IMMUNITY"); + } + + handler->PSendSysMessage("Stances: 0x{:08X}", spell->Stances); + handler->PSendSysMessage("StancesNot: 0x{:08X}", spell->StancesNot); + } + + static void PrintEffects(ChatHandler* handler, SpellInfo const* spell) + { + for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i) + { + SpellEffectInfo const& eff = spell->Effects[i]; + + if (!eff.Effect) + continue; + + handler->PSendSysMessage("--- Effect {} ---", i); + handler->PSendSysMessage(" Effect: {} ({})", eff.Effect, GetSpellEffectName(eff.Effect)); + handler->PSendSysMessage(" Aura: {} ({})", static_cast(eff.ApplyAuraName), GetAuraTypeName(static_cast(eff.ApplyAuraName))); + handler->PSendSysMessage(" BasePoints: {}", eff.BasePoints); + handler->PSendSysMessage(" DieSides: {}", eff.DieSides); + handler->PSendSysMessage(" RealPointsPerLevel: {:.4f}", eff.RealPointsPerLevel); + handler->PSendSysMessage(" PointsPerComboPoint: {:.2f}", eff.PointsPerComboPoint); + handler->PSendSysMessage(" ValueMultiplier: {:.4f}", eff.ValueMultiplier); + handler->PSendSysMessage(" DamageMultiplier: {:.4f}", eff.DamageMultiplier); + handler->PSendSysMessage(" BonusMultiplier: {:.4f}", eff.BonusMultiplier); + handler->PSendSysMessage(" MiscValue: {}", eff.MiscValue); + handler->PSendSysMessage(" MiscValueB: {}", eff.MiscValueB); + handler->PSendSysMessage(" Mechanic: {} ({})", static_cast(eff.Mechanic), EnumUtils::ToConstant(eff.Mechanic)); + handler->PSendSysMessage(" TriggerSpell: {}", eff.TriggerSpell); + handler->PSendSysMessage(" Amplitude: {}", eff.Amplitude); + handler->PSendSysMessage(" ItemType: {}", eff.ItemType); + handler->PSendSysMessage(" SpellClassMask: 0x{:08X} 0x{:08X} 0x{:08X}", eff.SpellClassMask[0], eff.SpellClassMask[1], eff.SpellClassMask[2]); + } + } + + static void PrintTargets(ChatHandler* handler, SpellInfo const* spell) + { + handler->PSendSysMessage("Targets: 0x{:08X}", spell->Targets); + handler->PSendSysMessage("TargetCreatureType: 0x{:08X}", spell->TargetCreatureType); + handler->PSendSysMessage("MaxAffectedTargets: {}", spell->MaxAffectedTargets); + handler->PSendSysMessage("MaxTargetLevel: {}", spell->MaxTargetLevel); + + for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i) + { + SpellEffectInfo const& eff = spell->Effects[i]; + + if (!eff.Effect) + continue; + + Targets targetA = eff.TargetA.GetTarget(); + Targets targetB = eff.TargetB.GetTarget(); + + handler->PSendSysMessage("--- Effect {} ---", i); + handler->PSendSysMessage(" TargetA: {} ({})", static_cast(targetA), GetTargetName(static_cast(targetA))); + handler->PSendSysMessage(" TargetB: {} ({})", static_cast(targetB), GetTargetName(static_cast(targetB))); + + if (eff.RadiusEntry) + handler->PSendSysMessage(" Radius: {:.1f}", eff.RadiusEntry->RadiusMax); + handler->PSendSysMessage(" ChainTarget: {}", eff.ChainTarget); + } + } + + static void PrintGeneralInfo(ChatHandler* handler, SpellInfo const* spell) + { + if (spell->CastTimeEntry) + handler->PSendSysMessage("CastTime: {} ms", spell->CastTimeEntry->CastTime); + + if (spell->DurationEntry) + handler->PSendSysMessage("Duration: {} / {} / {} ms", spell->DurationEntry->Duration[0], spell->DurationEntry->Duration[1], spell->DurationEntry->Duration[2]); + + if (spell->RangeEntry) + handler->PSendSysMessage("Range: {:.1f}-{:.1f} (hostile), {:.1f}-{:.1f} (friendly)", + spell->RangeEntry->RangeMin[0], spell->RangeEntry->RangeMax[0], + spell->RangeEntry->RangeMin[1], spell->RangeEntry->RangeMax[1]); + + handler->PSendSysMessage("RecoveryTime: {} ms", spell->RecoveryTime); + handler->PSendSysMessage("CategoryRecoveryTime: {} ms", spell->CategoryRecoveryTime); + handler->PSendSysMessage("StartRecoveryTime: {} ms (Category: {})", spell->StartRecoveryTime, spell->StartRecoveryCategory); + + handler->PSendSysMessage("InterruptFlags: 0x{:08X}", spell->InterruptFlags); + handler->PSendSysMessage("AuraInterruptFlags: 0x{:08X}", spell->AuraInterruptFlags); + handler->PSendSysMessage("ChannelInterruptFlags: 0x{:08X}", spell->ChannelInterruptFlags); + + handler->PSendSysMessage("ProcFlags: 0x{:08X}", spell->ProcFlags); + handler->PSendSysMessage("ProcChance: {}%", spell->ProcChance); + handler->PSendSysMessage("ProcCharges: {}", spell->ProcCharges); + + handler->PSendSysMessage("SpellLevel: {}, BaseLevel: {}, MaxLevel: {}", spell->SpellLevel, spell->BaseLevel, spell->MaxLevel); + + handler->PSendSysMessage("PowerType: {} ({})", spell->PowerType, GetPowerName(spell->PowerType)); + handler->PSendSysMessage("ManaCost: {}", spell->ManaCost); + handler->PSendSysMessage("ManaCostPercentage: {}", spell->ManaCostPercentage); + handler->PSendSysMessage("ManaPerSecond: {}", spell->ManaPerSecond); + + handler->PSendSysMessage("Speed: {:.2f}", spell->Speed); + + handler->PSendSysMessage("StackAmount: {}", spell->StackAmount); + + if (spell->EquippedItemClass >= 0) + handler->PSendSysMessage("EquippedItemClass: {}, SubClassMask: 0x{:08X}, InvTypeMask: 0x{:08X}", + spell->EquippedItemClass, static_cast(spell->EquippedItemSubClassMask), static_cast(spell->EquippedItemInventoryTypeMask)); + + handler->PSendSysMessage("SpellFamilyName: {} ({})", spell->SpellFamilyName, GetSpellFamilyName(spell->SpellFamilyName)); + handler->PSendSysMessage("SpellFamilyFlags: 0x{:08X} 0x{:08X} 0x{:08X}", spell->SpellFamilyFlags[0], spell->SpellFamilyFlags[1], spell->SpellFamilyFlags[2]); + + handler->PSendSysMessage("DmgClass: {} ({})", spell->DmgClass, GetDmgClassName(spell->DmgClass)); + handler->PSendSysMessage("PreventionType: {} ({})", spell->PreventionType, GetPreventionTypeName(spell->PreventionType)); + handler->PSendSysMessage("SchoolMask: 0x{:02X}", spell->SchoolMask); + } + + static bool HandleSpellInfoAttributesCommand(ChatHandler* handler, SpellInfo const* spell) + { + if (!spell) + { + handler->SendErrorMessage(LANG_COMMAND_NOSPELLFOUND); + return false; + } + + handler->PSendSysMessage("===== SPELL ATTRIBUTES ====="); + PrintBasicInfo(handler, spell); + PrintAttributes(handler, spell); + handler->PSendSysMessage("============================"); + return true; + } + + static bool HandleSpellInfoEffectsCommand(ChatHandler* handler, SpellInfo const* spell) + { + if (!spell) + { + handler->SendErrorMessage(LANG_COMMAND_NOSPELLFOUND); + return false; + } + + handler->PSendSysMessage("====== SPELL EFFECTS ======"); + PrintBasicInfo(handler, spell); + PrintEffects(handler, spell); + handler->PSendSysMessage("==========================="); + return true; + } + + static bool HandleSpellInfoTargetsCommand(ChatHandler* handler, SpellInfo const* spell) + { + if (!spell) + { + handler->SendErrorMessage(LANG_COMMAND_NOSPELLFOUND); + return false; + } + + handler->PSendSysMessage("====== SPELL TARGETS ======"); + PrintBasicInfo(handler, spell); + PrintTargets(handler, spell); + handler->PSendSysMessage("==========================="); + return true; + } + + static bool HandleSpellInfoAllCommand(ChatHandler* handler, SpellInfo const* spell) + { + if (!spell) + { + handler->SendErrorMessage(LANG_COMMAND_NOSPELLFOUND); + return false; + } + + handler->PSendSysMessage("========== SPELL INFO =========="); + PrintBasicInfo(handler, spell); + PrintAttributes(handler, spell); + PrintGeneralInfo(handler, spell); + PrintEffects(handler, spell); + PrintTargets(handler, spell); + handler->PSendSysMessage("================================"); + return true; + } +}; + +void AddSC_spellinfo_commandscript() +{ + new spellinfo_commandscript(); +} From 585184b639e4bc474dc8ba288950af59c7b812c3 Mon Sep 17 00:00:00 2001 From: blinkysc <37940565+blinkysc@users.noreply.github.com> Date: Thu, 26 Feb 2026 02:49:52 -0600 Subject: [PATCH 126/150] fix(DB/Proc): Add missing NONE DmgClass proc flags to Blue Dragon (#24890) Co-authored-by: blinkysc --- data/sql/updates/pending_db_world/rev_1772086971482356750.sql | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 data/sql/updates/pending_db_world/rev_1772086971482356750.sql diff --git a/data/sql/updates/pending_db_world/rev_1772086971482356750.sql b/data/sql/updates/pending_db_world/rev_1772086971482356750.sql new file mode 100644 index 000000000..a2ce8e378 --- /dev/null +++ b/data/sql/updates/pending_db_world/rev_1772086971482356750.sql @@ -0,0 +1,2 @@ +-- Darkmoon Card: Blue Dragon - add NONE DmgClass proc flags and fix phase to CAST +UPDATE `spell_proc` SET `ProcFlags` = 0x15400, `SpellPhaseMask` = 1 WHERE `SpellId` = 23688; From 1358d73e23bd9d248a01a8349b16e8400703f658 Mon Sep 17 00:00:00 2001 From: blinkysc <37940565+blinkysc@users.noreply.github.com> Date: Thu, 26 Feb 2026 02:50:19 -0600 Subject: [PATCH 127/150] fix(Core/Spells): Fix Hungering Cold breaking from disease damage (#24888) Co-authored-by: blinkysc Co-authored-by: ariel- --- src/server/scripts/Spells/spell_dk.cpp | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/src/server/scripts/Spells/spell_dk.cpp b/src/server/scripts/Spells/spell_dk.cpp index 06afadf85..6222592b8 100644 --- a/src/server/scripts/Spells/spell_dk.cpp +++ b/src/server/scripts/Spells/spell_dk.cpp @@ -614,16 +614,18 @@ class spell_dk_hungering_cold : public AuraScript { PrepareAuraScript(spell_dk_hungering_cold); - void HandleProc(ProcEventInfo& eventInfo) + bool CheckProc(ProcEventInfo& eventInfo) { - PreventDefaultAction(); - if (eventInfo.GetDamageInfo() && eventInfo.GetDamageInfo()->GetDamage() > 0 && (!eventInfo.GetSpellInfo() || eventInfo.GetSpellInfo()->Dispel != DISPEL_DISEASE)) - SetDuration(0); + SpellInfo const* spellInfo = eventInfo.GetSpellInfo(); + if (!spellInfo) + return true; + + return spellInfo->Dispel != DISPEL_DISEASE; } void Register() override { - OnProc += AuraProcFn(spell_dk_hungering_cold::HandleProc); + DoCheckProc += AuraCheckProcFn(spell_dk_hungering_cold::CheckProc); } }; From e6aae1e1c4b562eccad16254da3e63b7d6ef58cc Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Thu, 26 Feb 2026 08:50:38 +0000 Subject: [PATCH 128/150] chore(DB): import pending files Referenced commit(s): 5cf9ae11a58e27352e07c88c6039521938934697 --- .../rev_1771989601546823271.sql => db_world/2026_02_26_03.sql} | 1 + .../rev_1772086971482356750.sql => db_world/2026_02_26_04.sql} | 1 + 2 files changed, 2 insertions(+) rename data/sql/updates/{pending_db_world/rev_1771989601546823271.sql => db_world/2026_02_26_03.sql} (96%) rename data/sql/updates/{pending_db_world/rev_1772086971482356750.sql => db_world/2026_02_26_04.sql} (80%) diff --git a/data/sql/updates/pending_db_world/rev_1771989601546823271.sql b/data/sql/updates/db_world/2026_02_26_03.sql similarity index 96% rename from data/sql/updates/pending_db_world/rev_1771989601546823271.sql rename to data/sql/updates/db_world/2026_02_26_03.sql index 16cc99283..6052a569e 100644 --- a/data/sql/updates/pending_db_world/rev_1771989601546823271.sql +++ b/data/sql/updates/db_world/2026_02_26_03.sql @@ -1,3 +1,4 @@ +-- DB update 2026_02_26_02 -> 2026_02_26_03 -- DELETE FROM `command` WHERE `name` IN ('spellinfo', 'spellinfo attributes', 'spellinfo effects', 'spellinfo targets', 'spellinfo all'); INSERT INTO `command` (`name`, `security`, `help`) VALUES diff --git a/data/sql/updates/pending_db_world/rev_1772086971482356750.sql b/data/sql/updates/db_world/2026_02_26_04.sql similarity index 80% rename from data/sql/updates/pending_db_world/rev_1772086971482356750.sql rename to data/sql/updates/db_world/2026_02_26_04.sql index a2ce8e378..8dc44aeda 100644 --- a/data/sql/updates/pending_db_world/rev_1772086971482356750.sql +++ b/data/sql/updates/db_world/2026_02_26_04.sql @@ -1,2 +1,3 @@ +-- DB update 2026_02_26_03 -> 2026_02_26_04 -- Darkmoon Card: Blue Dragon - add NONE DmgClass proc flags and fix phase to CAST UPDATE `spell_proc` SET `ProcFlags` = 0x15400, `SpellPhaseMask` = 1 WHERE `SpellId` = 23688; From 028db4c0332c03f27d4847ff0bb533012bdc7d91 Mon Sep 17 00:00:00 2001 From: blinkysc <37940565+blinkysc@users.noreply.github.com> Date: Thu, 26 Feb 2026 10:18:24 -0600 Subject: [PATCH 129/150] fix(Core/Spells): Check DONT_BREAK_STEALTH in stealth proc guard (#24898) Co-authored-by: blinkysc --- src/server/game/Spells/Auras/SpellAuras.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/server/game/Spells/Auras/SpellAuras.cpp b/src/server/game/Spells/Auras/SpellAuras.cpp index 0c908e848..dc5eac5e6 100644 --- a/src/server/game/Spells/Auras/SpellAuras.cpp +++ b/src/server/game/Spells/Auras/SpellAuras.cpp @@ -2184,7 +2184,7 @@ uint8 Aura::GetProcEffectMask(AuraApplication* aurApp, ProcEventInfo& eventInfo, if (m_spellInfo->HasAura(SPELL_AURA_MOD_STEALTH)) { if (SpellInfo const* spellInfo = eventInfo.GetSpellInfo()) - if (spellInfo->IsPositive() || !eventInfo.GetActor()->IsHostileTo(aurApp->GetTarget())) + if (spellInfo->IsPositive() || !eventInfo.GetActor()->IsHostileTo(aurApp->GetTarget()) || spellInfo->HasAttribute(SPELL_ATTR0_CU_DONT_BREAK_STEALTH)) return 0; } From 54dba754835c07216636e33525ff58ce0f429ddf Mon Sep 17 00:00:00 2001 From: blinkysc <37940565+blinkysc@users.noreply.github.com> Date: Thu, 26 Feb 2026 12:00:33 -0600 Subject: [PATCH 130/150] fix(Core/Spells): Turn the Tables buff only applies to the rogue (#24896) Co-authored-by: blinkysc --- src/server/scripts/Spells/spell_rogue.cpp | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/src/server/scripts/Spells/spell_rogue.cpp b/src/server/scripts/Spells/spell_rogue.cpp index b0ffb02a6..832ec5c35 100644 --- a/src/server/scripts/Spells/spell_rogue.cpp +++ b/src/server/scripts/Spells/spell_rogue.cpp @@ -1046,13 +1046,19 @@ class spell_rog_turn_the_tables : public AuraScript }; // 52910, 52914, 52915 - Turn the Tables (proc) -class spell_rog_turn_the_tables_proc : public AuraScript +class spell_rog_turn_the_tables_proc : public SpellScript { - PrepareAuraScript(spell_rog_turn_the_tables_proc); + PrepareSpellScript(spell_rog_turn_the_tables_proc); + + void FilterTargets(std::list& targets) + { + targets.clear(); + targets.push_back(GetCaster()); + } void Register() override { - // No special handling needed - default behavior + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_rog_turn_the_tables_proc::FilterTargets, EFFECT_0, TARGET_UNIT_CASTER_AREA_RAID); } }; From 76ec5e39a0bb3b75b779501a854c83e8e669cab2 Mon Sep 17 00:00:00 2001 From: Gultask <100873791+Gultask@users.noreply.github.com> Date: Thu, 26 Feb 2026 15:56:59 -0300 Subject: [PATCH 131/150] fix(DB/Loot): Gluth Loot Table (#24737) Co-authored-by: amed80 <8395873+amed80@users.noreply.github.com> --- .../rev_1771283323680167400.sql | 305 ++++++++++++++++++ 1 file changed, 305 insertions(+) create mode 100644 data/sql/updates/pending_db_world/rev_1771283323680167400.sql diff --git a/data/sql/updates/pending_db_world/rev_1771283323680167400.sql b/data/sql/updates/pending_db_world/rev_1771283323680167400.sql new file mode 100644 index 000000000..aa3c47b12 --- /dev/null +++ b/data/sql/updates/pending_db_world/rev_1771283323680167400.sql @@ -0,0 +1,305 @@ +-- Gluth +DELETE FROM `creature_loot_template` WHERE (`Entry` = 15932) AND `GroupId` = 2; +INSERT INTO `creature_loot_template` (`Entry`, `Item`, `Reference`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES +(15932, 39139, 0, 0, 0, 1, 2, 1, 1, 'Gluth - Ravaging Sabatons'), +(15932, 39140, 0, 0, 0, 1, 2, 1, 1, 'Gluth - Knife of Incision'), +(15932, 39141, 0, 0, 0, 1, 2, 1, 1, 'Gluth - Deflection Band'), +(15932, 39146, 0, 0, 0, 1, 2, 1, 1, 'Gluth - Collar of Dissolution'), +(15932, 39188, 0, 0, 0, 1, 2, 1, 1, 'Gluth - Chivalric Chestguard'), +(15932, 39189, 0, 0, 0, 1, 2, 1, 1, 'Gluth - Boots of Persistence'), +(15932, 39190, 0, 0, 0, 1, 2, 1, 1, 'Gluth - Agonal Sash'), +(15932, 39191, 0, 0, 0, 1, 2, 1, 1, 'Gluth - Splint-Bound Leggings'), +(15932, 39192, 0, 0, 0, 1, 2, 1, 1, 'Gluth - Gloves of Dark Gestures'), +(15932, 39193, 0, 0, 0, 1, 2, 1, 1, 'Gluth - Band of Neglected Pleas'), +(15932, 39194, 0, 0, 0, 1, 2, 1, 1, 'Gluth - Rusted-Link Spiked Gauntlets'), +(15932, 39195, 0, 0, 0, 1, 2, 1, 1, 'Gluth - Bracers of Lost Sentiments'), +(15932, 39196, 0, 0, 0, 1, 2, 1, 1, 'Gluth - Boots of the Worshiper'), +(15932, 39197, 0, 0, 0, 1, 2, 1, 1, 'Gluth - Gauntlets of the Master'), +(15932, 39198, 0, 0, 0, 1, 2, 1, 1, 'Gluth - Frostblight Pauldrons'), +(15932, 39199, 0, 0, 0, 1, 2, 1, 1, 'Gluth - Watchful Eye'), +(15932, 39200, 0, 0, 0, 1, 2, 1, 1, 'Gluth - Grieving Spellblade'), +(15932, 39215, 0, 0, 0, 1, 2, 1, 1, 'Gluth - Boots of the Follower'), +(15932, 39216, 0, 0, 0, 1, 2, 1, 1, 'Gluth - Sash of Mortal Desire'), +(15932, 39217, 0, 0, 0, 1, 2, 1, 1, 'Gluth - Avenging Combat Leggings'), +(15932, 39221, 0, 0, 0, 1, 2, 1, 1, 'Gluth - Wraith Spear'), +(15932, 39224, 0, 0, 0, 1, 2, 1, 1, 'Gluth - Leggings of Discord'), +(15932, 39225, 0, 0, 0, 1, 2, 1, 1, 'Gluth - Cloak of Armed Strife'), +(15932, 39226, 0, 0, 0, 1, 2, 1, 1, 'Gluth - Maexxna\'s Femur'), +(15932, 39228, 0, 0, 0, 1, 2, 1, 1, 'Gluth - Web Cocoon Grips'), +(15932, 39229, 0, 0, 0, 1, 2, 1, 1, 'Gluth - Embrace of the Spider'), +(15932, 39230, 0, 0, 0, 1, 2, 1, 1, 'Gluth - Spaulders of the Monstrosity'), +(15932, 39231, 0, 0, 0, 1, 2, 1, 1, 'Gluth - Timeworn Silken Band'), +(15932, 39232, 0, 0, 0, 1, 2, 1, 1, 'Gluth - Pendant of Lost Vocations'), +(15932, 39233, 0, 0, 0, 1, 2, 1, 1, 'Gluth - Aegis of Damnation'), +(15932, 39234, 0, 0, 0, 1, 2, 1, 1, 'Gluth - Plague-Impervious Boots'), +(15932, 39235, 0, 0, 0, 1, 2, 1, 1, 'Gluth - Bone-Framed Bracers'), +(15932, 39236, 0, 0, 0, 1, 2, 1, 1, 'Gluth - Trespasser\'s Boots'), +(15932, 39237, 0, 0, 0, 1, 2, 1, 1, 'Gluth - Spaulders of Resumed Battle'), +(15932, 39239, 0, 0, 0, 1, 2, 1, 1, 'Gluth - Chestplate of the Risen Soldier'), +(15932, 39240, 0, 0, 0, 1, 2, 1, 1, 'Gluth - Noth\'s Curse'), +(15932, 39241, 0, 0, 0, 1, 2, 1, 1, 'Gluth - Dark Shroud of the Scourge'), +(15932, 39242, 0, 0, 0, 1, 2, 1, 1, 'Gluth - Robes of Hoarse Breaths'), +(15932, 39243, 0, 0, 0, 1, 2, 1, 1, 'Gluth - Handgrips of the Foredoomed'), +(15932, 39244, 0, 0, 0, 1, 2, 1, 1, 'Gluth - Ring of the Fated'), +(15932, 39245, 0, 0, 0, 1, 2, 1, 1, 'Gluth - Demise'), +(15932, 39246, 0, 0, 0, 1, 2, 1, 1, 'Gluth - Amulet of Autopsy'), +(15932, 39247, 0, 0, 0, 1, 2, 1, 1, 'Gluth - Cuffs of Dark Shadows'), +(15932, 39248, 0, 0, 0, 1, 2, 1, 1, 'Gluth - Tunic of the Lost Pack'), +(15932, 39249, 0, 0, 0, 1, 2, 1, 1, 'Gluth - Shoulderplates of Bloodshed'), +(15932, 39250, 0, 0, 0, 1, 2, 1, 1, 'Gluth - Ring of Holy Cleansing'), +(15932, 39251, 0, 0, 0, 1, 2, 1, 1, 'Gluth - Necrogenic Belt'), +(15932, 39252, 0, 0, 0, 1, 2, 1, 1, 'Gluth - Preceptor\'s Bindings'), +(15932, 39254, 0, 0, 0, 1, 2, 1, 1, 'Gluth - Saltarello Shoes'), +(15932, 39255, 0, 0, 0, 1, 2, 1, 1, 'Gluth - Staff of the Plague Beast'), +(15932, 39261, 0, 0, 0, 1, 2, 1, 1, 'Gluth - Tainted Girdle of Mending'), +(15932, 39262, 0, 0, 0, 1, 2, 1, 1, 'Gluth - Gauntlets of Combined Strength'), +(15932, 39267, 0, 0, 0, 1, 2, 1, 1, 'Gluth - Abomination Shoulderblades'), +(15932, 39270, 0, 0, 0, 1, 2, 1, 1, 'Gluth - Hatestrike'), +(15932, 39271, 0, 0, 0, 1, 2, 1, 1, 'Gluth - Blade of Dormant Memories'), +(15932, 39272, 0, 0, 0, 1, 2, 1, 1, 'Gluth - Drape of Surgery'), +(15932, 39273, 0, 0, 0, 1, 2, 1, 1, 'Gluth - Sullen Cloth Boots'), +(15932, 39274, 0, 0, 0, 1, 2, 1, 1, 'Gluth - Retcher\'s Shoulderpads'), +(15932, 39275, 0, 0, 0, 1, 2, 1, 1, 'Gluth - Contagion Gloves'), +(15932, 39276, 0, 0, 0, 1, 2, 1, 1, 'Gluth - The Skull of Ruin'), +(15932, 39277, 0, 0, 0, 1, 2, 1, 1, 'Gluth - Sealing Ring of Grobbulus'), +(15932, 39278, 0, 0, 0, 1, 2, 1, 1, 'Gluth - Bands of Anxiety'), +(15932, 39279, 0, 0, 0, 1, 2, 1, 1, 'Gluth - Blistered Belt of Decay'), +(15932, 39280, 0, 0, 0, 1, 2, 1, 1, 'Gluth - Leggings of Innumerable Barbs'), +(15932, 39281, 0, 0, 0, 1, 2, 1, 1, 'Gluth - Infection Repulser'), +(15932, 39282, 0, 0, 0, 1, 2, 1, 1, 'Gluth - Bone-Linked Amulet'), +(15932, 39283, 0, 0, 0, 1, 2, 1, 1, 'Gluth - Putrescent Bands'), +(15932, 39284, 0, 0, 0, 1, 2, 1, 1, 'Gluth - Miasma Mantle'), +(15932, 39285, 0, 0, 0, 1, 2, 1, 1, 'Gluth - Handgrips of Turmoil'), +(15932, 39296, 0, 0, 0, 1, 2, 1, 1, 'Gluth - Accursed Bow of the Elite'), +(15932, 39297, 0, 0, 0, 1, 2, 1, 1, 'Gluth - Cloak of Darkening'), +(15932, 39298, 0, 0, 0, 1, 2, 1, 1, 'Gluth - Waistguard of the Tutor'), +(15932, 39299, 0, 0, 0, 1, 2, 1, 1, 'Gluth - Rapid Attack Gloves'), +(15932, 39306, 0, 0, 0, 1, 2, 1, 1, 'Gluth - Plated Gloves of Relief'), +(15932, 39307, 0, 0, 0, 1, 2, 1, 1, 'Gluth - Iron Rings of Endurance'), +(15932, 39308, 0, 0, 0, 1, 2, 1, 1, 'Gluth - Girdle of Lenience'), +(15932, 39309, 0, 0, 0, 1, 2, 1, 1, 'Gluth - Leggings of the Instructor'), +(15932, 39310, 0, 0, 0, 1, 2, 1, 1, 'Gluth - Mantle of the Extensive Mind'), +(15932, 39311, 0, 0, 0, 1, 2, 1, 1, 'Gluth - Scepter of Murmuring Spirits'), +(15932, 39344, 0, 0, 0, 1, 2, 1, 1, 'Gluth - Slayer of the Lifeless'), +(15932, 39345, 0, 0, 0, 1, 2, 1, 1, 'Gluth - Girdle of the Ascended Phantom'), +(15932, 39369, 0, 0, 0, 1, 2, 1, 1, 'Gluth - Sabatons of Deathlike Gloom'), +(15932, 39379, 0, 0, 0, 1, 2, 1, 1, 'Gluth - Spectral Rider\'s Girdle'), +(15932, 39386, 0, 0, 0, 1, 2, 1, 1, 'Gluth - Tunic of Dislocation'), +(15932, 39388, 0, 0, 0, 1, 2, 1, 1, 'Gluth - Spirit-World Glass'), +(15932, 39389, 0, 0, 0, 1, 2, 1, 1, 'Gluth - Signet of the Malevolent'), +(15932, 39390, 0, 0, 0, 1, 2, 1, 1, 'Gluth - Resurgent Phantom Bindings'), +(15932, 39391, 0, 0, 0, 1, 2, 1, 1, 'Gluth - Heinous Mail Chestguard'), +(15932, 39392, 0, 0, 0, 1, 2, 1, 1, 'Gluth - Veiled Amulet of Life'), +-- (15932, 39427, 0, 0, 0, 1, 2, 1, 1, 'Gluth - Omen of Ruin'), +-- (15932, 39467, 0, 0, 0, 1, 2, 1, 1, 'Gluth - Minion Bracers'), +-- (15932, 39468, 0, 0, 0, 1, 2, 1, 1, 'Gluth - The Stray'), +-- (15932, 39470, 0, 0, 0, 1, 2, 1, 1, 'Gluth - Medallion of the Disgraced'), +-- (15932, 39472, 0, 0, 0, 1, 2, 1, 1, 'Gluth - Chain of Latent Energies'), +-- (15932, 39473, 0, 0, 0, 1, 2, 1, 1, 'Gluth - Contortion'), +(15932, 39256, 0, 0, 0, 1, 2, 1, 1, 'Gluth - Sulfur Stave'), +(15932, 39257, 0, 0, 0, 1, 2, 1, 1, 'Gluth - Loatheb\'s Shadow'), +(15932, 39258, 0, 0, 0, 1, 2, 1, 1, 'Gluth - Legplates of Inescapable Death'), +(15932, 39259, 0, 0, 0, 1, 2, 1, 1, 'Gluth - Fungi-Stained Coverings'), +(15932, 39260, 0, 0, 0, 1, 2, 1, 1, 'Gluth - Helm of the Corrupted Mind'), +(15932, 39291, 0, 0, 0, 1, 2, 1, 1, 'Gluth - Torment of the Banished'), +(15932, 39292, 0, 0, 0, 1, 2, 1, 1, 'Gluth - Repelling Charge'), +(15932, 39293, 0, 0, 0, 1, 2, 1, 1, 'Gluth - Blackened Legplates of Feugen'), +(15932, 39294, 0, 0, 0, 1, 2, 1, 1, 'Gluth - Arc-Scorched Helmet'), +(15932, 39295, 0, 0, 0, 1, 2, 1, 1, 'Gluth - Cowl of Sheet Lightning'), +(15932, 39393, 0, 0, 0, 1, 2, 1, 1, 'Gluth - Claymore of Ancient Power'), +(15932, 39394, 0, 0, 0, 1, 2, 1, 1, 'Gluth - Charmed Cierge'), +(15932, 39395, 0, 0, 0, 1, 2, 1, 1, 'Gluth - Thane\'s Tainted Greathelm'), +(15932, 39396, 0, 0, 0, 1, 2, 1, 1, 'Gluth - Gown of Blaumeux'), +(15932, 39397, 0, 0, 0, 1, 2, 1, 1, 'Gluth - Pauldrons of Havoc'); + +DELETE FROM `reference_loot_template` WHERE (`Entry` = 34142); +INSERT INTO `reference_loot_template` (`Entry`, `Item`, `Reference`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES +(34142, 39701, 0, 0, 0, 1, 1, 1, 1, 'Dawnwalkers'), +(34142, 39702, 0, 0, 0, 1, 1, 1, 1, 'Arachnoid Gold Band'), +(34142, 39703, 0, 0, 0, 1, 1, 1, 1, 'Rescinding Grips'), +(34142, 39704, 0, 0, 0, 1, 1, 1, 1, 'Pauldrons of Unnatural Death'), +(34142, 39706, 0, 0, 0, 1, 1, 1, 1, 'Sabatons of Sudden Reprisal'), +(34142, 39712, 0, 0, 0, 1, 1, 1, 1, 'Gemmed Wand of the Nerubians'), +(34142, 39714, 0, 0, 0, 1, 1, 1, 1, 'Webbed Death'), +(34142, 39716, 0, 0, 0, 1, 1, 1, 1, 'Shield of Assimilation'), +(34142, 39717, 0, 0, 0, 1, 1, 1, 1, 'Inexorable Sabatons'), +(34142, 39718, 0, 0, 0, 1, 1, 1, 1, 'Corpse Scarab Handguards'), +(34142, 39719, 0, 0, 0, 1, 1, 1, 1, 'Mantle of the Locusts'), +(34142, 39720, 0, 0, 0, 1, 1, 1, 1, 'Leggings of Atrophy'), +(34142, 39721, 0, 0, 0, 1, 1, 1, 1, 'Sash of the Parlor'), +(34142, 39722, 0, 0, 0, 1, 1, 1, 1, 'Swarm Bindings'), +-- (34142, 40064, 0, 0, 0, 1, 1, 1, 1, 'Thunderstorm Amulet'), +-- (34142, 40065, 0, 0, 0, 1, 1, 1, 1, 'Fool\'s Trial'), +-- (34142, 40069, 0, 0, 0, 1, 1, 1, 1, 'Heritage'), +-- (34142, 40071, 0, 0, 0, 1, 1, 1, 1, 'Chains of Adoration'), +-- (34142, 40074, 0, 0, 0, 1, 1, 1, 1, 'Strong-Handed Ring'), +-- (34142, 40075, 0, 0, 0, 1, 1, 1, 1, 'Ruthlessness'), +-- (34142, 40080, 0, 0, 0, 1, 1, 1, 1, 'Lost Jewel'), +-- (34142, 40107, 0, 0, 0, 1, 1, 1, 1, 'Sand-Worn Band'), +-- (34142, 40108, 0, 0, 0, 1, 1, 1, 1, 'Seized Beauty'), +(34142, 39723, 0, 0, 0, 1, 1, 1, 1, 'Fire-Scorched Greathelm'), +(34142, 39724, 0, 0, 0, 1, 1, 1, 1, 'Cult\'s Chestguard'), +(34142, 39725, 0, 0, 0, 1, 1, 1, 1, 'Epaulets of the Grieving Servant'), +(34142, 39726, 0, 0, 0, 1, 1, 1, 1, 'Callous-Hearted Gauntlets'), +(34142, 39727, 0, 0, 0, 1, 1, 1, 1, 'Dislocating Handguards'), +(34142, 39728, 0, 0, 0, 1, 1, 1, 1, 'Totem of Misery'), +(34142, 39729, 0, 0, 0, 1, 1, 1, 1, 'Bracers of the Tyrant'), +(34142, 39730, 0, 0, 0, 1, 1, 1, 1, 'Widow\'s Fury'), +(34142, 39731, 0, 0, 0, 1, 1, 1, 1, 'Punctilious Bindings'), +(34142, 39732, 0, 0, 0, 1, 1, 1, 1, 'Faerlina\'s Madness'), +(34142, 39733, 0, 0, 0, 1, 1, 1, 1, 'Gloves of Token Respect'), +(34142, 39734, 0, 0, 0, 1, 1, 1, 1, 'Atonement Greaves'), +(34142, 39735, 0, 0, 0, 1, 1, 1, 1, 'Belt of False Dignity'), +(34142, 39756, 0, 0, 0, 1, 1, 1, 1, 'Tunic of Prejudice'), +(34142, 39757, 0, 0, 0, 1, 1, 1, 1, 'Idol of Worship'), +(34142, 39758, 0, 0, 0, 1, 1, 1, 1, 'The Jawbone'), +(34142, 39759, 0, 0, 0, 1, 1, 1, 1, 'Ablative Chitin Girdle'), +(34142, 39760, 0, 0, 0, 1, 1, 1, 1, 'Helm of Diminished Pride'), +(34142, 39761, 0, 0, 0, 1, 1, 1, 1, 'Infectious Skitterer Leggings'), +(34142, 39762, 0, 0, 0, 1, 1, 1, 1, 'Torn Web Wrapping'), +(34142, 39763, 0, 0, 0, 1, 1, 1, 1, 'Wraith Strike'), +(34142, 39764, 0, 0, 0, 1, 1, 1, 1, 'Bindings of the Hapless Prey'), +(34142, 39765, 0, 0, 0, 1, 1, 1, 1, 'Sinner\'s Bindings'), +(34142, 39766, 0, 0, 0, 1, 1, 1, 1, 'Matriarch\'s Spawn'), +(34142, 39767, 0, 0, 0, 1, 1, 1, 1, 'Undiminished Battleplate'), +(34142, 39768, 0, 0, 0, 1, 1, 1, 1, 'Cowl of the Perished'), +(34142, 40060, 0, 0, 0, 1, 1, 1, 1, 'Distorted Limbs'), +(34142, 40061, 0, 0, 0, 1, 1, 1, 1, 'Quivering Tunic'), +(34142, 40062, 0, 0, 0, 1, 1, 1, 1, 'Digested Silken Robes'), +(34142, 40063, 0, 0, 0, 1, 1, 1, 1, 'Mantle of Shattered Kinship'), +-- (34142, 40250, 0, 0, 0, 1, 1, 1, 1, 'Aged Winter Cloak'), +-- (34142, 40251, 0, 0, 0, 1, 1, 1, 1, 'Shroud of Luminosity'), +-- (34142, 40252, 0, 0, 0, 1, 1, 1, 1, 'Cloak of the Shadowed Sun'), +-- (34142, 40253, 0, 0, 0, 1, 1, 1, 1, 'Shawl of the Old Maid'), +-- (34142, 40254, 0, 0, 0, 1, 1, 1, 1, 'Cloak of Averted Crisis'), +-- (34142, 40255, 0, 0, 0, 1, 1, 1, 1, 'Dying Curse'), +-- (34142, 40256, 0, 0, 0, 1, 1, 1, 1, 'Grim Toll'), +-- (34142, 40257, 0, 0, 0, 1, 1, 1, 1, 'Defender\'s Code'), +-- (34142, 40258, 0, 0, 0, 1, 1, 1, 1, 'Forethought Talisman'), +(34142, 40259, 0, 0, 0, 1, 1, 1, 1, 'Waistguard of Divine Grace'), +(34142, 40260, 0, 0, 0, 1, 1, 1, 1, 'Belt of the Tortured'), +(34142, 40261, 0, 0, 0, 1, 1, 1, 1, 'Crude Discolored Battlegrips'), +(34142, 40262, 0, 0, 0, 1, 1, 1, 1, 'Gloves of Calculated Risk'), +(34142, 40263, 0, 0, 0, 1, 1, 1, 1, 'Fleshless Girdle'), +(34142, 40264, 0, 0, 0, 1, 1, 1, 1, 'Split Greathammer'), +(34142, 40265, 0, 0, 0, 1, 1, 1, 1, 'Arrowsong'), +(34142, 40266, 0, 0, 0, 1, 1, 1, 1, 'Hero\'s Surrender'), +(34142, 40267, 0, 0, 0, 1, 1, 1, 1, 'Totem of Hex'), +(34142, 40268, 0, 0, 0, 1, 1, 1, 1, 'Libram of Tolerance'), +(34142, 40269, 0, 0, 0, 1, 1, 1, 1, 'Boots of Persuasion'), +(34142, 40270, 0, 0, 0, 1, 1, 1, 1, 'Boots of Septic Wounds'), +(34142, 40271, 0, 0, 0, 1, 1, 1, 1, 'Sash of Solitude'), +(34142, 40272, 0, 0, 0, 1, 1, 1, 1, 'Girdle of the Gambit'), +(34142, 40273, 0, 0, 0, 1, 1, 1, 1, 'Surplus Limb'), +(34142, 40274, 0, 0, 0, 1, 1, 1, 1, 'Bracers of Liberation'), +(34142, 40275, 0, 0, 0, 1, 1, 1, 1, 'Depraved Linked Belt'), +(34142, 40277, 0, 0, 0, 1, 1, 1, 1, 'Tunic of Indulgence'), +(34142, 40278, 0, 0, 0, 1, 1, 1, 1, 'Girdle of Chivalry'), +(34142, 40279, 0, 0, 0, 1, 1, 1, 1, 'Chestguard of the Exhausted'), +(34142, 40280, 0, 0, 0, 1, 1, 1, 1, 'Origin of Nightmares'), +(34142, 40281, 0, 0, 0, 1, 1, 1, 1, 'Twilight Mist'), +(34142, 40282, 0, 0, 0, 1, 1, 1, 1, 'Slime Stream Bands'), +(34142, 40283, 0, 0, 0, 1, 1, 1, 1, 'Fallout Impervious Tunic'), +(34142, 40284, 0, 0, 0, 1, 1, 1, 1, 'Plague Igniter'), +(34142, 40285, 0, 0, 0, 1, 1, 1, 1, 'Desecrated Past'), +(34142, 40287, 0, 0, 0, 1, 1, 1, 1, 'Cowl of Vanity'), +(34142, 40288, 0, 0, 0, 1, 1, 1, 1, 'Spaulders of Incoherence'), +(34142, 40289, 0, 0, 0, 1, 1, 1, 1, 'Sympathetic Amice'), +(34142, 40351, 0, 0, 0, 1, 1, 1, 1, 'Mantle of the Fatigued Sage'), +(34142, 40294, 0, 0, 0, 1, 1, 1, 1, 'Riveted Abomination Leggings'), +(34142, 40296, 0, 0, 0, 1, 1, 1, 1, 'Cover of Silence'), +(34142, 40297, 0, 0, 0, 1, 1, 1, 1, 'Sabatons of Endurance'), +(34142, 40298, 0, 0, 0, 1, 1, 1, 1, 'Faceguard of the Succumbed'), +(34142, 40299, 0, 0, 0, 1, 1, 1, 1, 'Pauldrons of the Abandoned'), +(34142, 40300, 0, 0, 0, 1, 1, 1, 1, 'Spire of Sunset'), +(34142, 40301, 0, 0, 0, 1, 1, 1, 1, 'Cincture of Polarity'), +(34142, 40302, 0, 0, 0, 1, 1, 1, 1, 'Benefactor\'s Gauntlets'), +(34142, 40303, 0, 0, 0, 1, 1, 1, 1, 'Wraps of the Persecuted'), +(34142, 40304, 0, 0, 0, 1, 1, 1, 1, 'Headpiece of Fungal Bloom'), +(34142, 40305, 0, 0, 0, 1, 1, 1, 1, 'Spaulders of Egotism'), +(34142, 40306, 0, 0, 0, 1, 1, 1, 1, 'Bracers of the Unholy Knight'), +(34142, 40315, 0, 0, 0, 1, 1, 1, 1, 'Shoulderpads of Secret Arts'), +(34142, 40316, 0, 0, 0, 1, 1, 1, 1, 'Gauntlets of Guiding Touch'), +(34142, 40317, 0, 0, 0, 1, 1, 1, 1, 'Girdle of Razuvious'), +(34142, 40318, 0, 0, 0, 1, 1, 1, 1, 'Legplates of Double Strikes'), +(34142, 40319, 0, 0, 0, 1, 1, 1, 1, 'Chestpiece of Suspicion'), +(34142, 40320, 0, 0, 0, 1, 1, 1, 1, 'Faithful Steel Sabatons'), +(34142, 40321, 0, 0, 0, 1, 1, 1, 1, 'Idol of the Shooting Star'), +(34142, 40322, 0, 0, 0, 1, 1, 1, 1, 'Totem of Dueling'), +(34142, 40323, 0, 0, 0, 1, 1, 1, 1, 'Esteemed Bindings'), +(34142, 40324, 0, 0, 0, 1, 1, 1, 1, 'Bands of Mutual Respect'), +(34142, 40325, 0, 0, 0, 1, 1, 1, 1, 'Bindings of the Expansive Mind'), +(34142, 40326, 0, 0, 0, 1, 1, 1, 1, 'Boots of Forlorn Wishes'), +(34142, 40327, 0, 0, 0, 1, 1, 1, 1, 'Girdle of Recuperation'), +(34142, 40328, 0, 0, 0, 1, 1, 1, 1, 'Helm of Vital Protection'), +(34142, 40329, 0, 0, 0, 1, 1, 1, 1, 'Hood of the Exodus'), +(34142, 40330, 0, 0, 0, 1, 1, 1, 1, 'Bracers of Unrelenting Attack'), +(34142, 40331, 0, 0, 0, 1, 1, 1, 1, 'Leggings of Failed Escape'), +(34142, 40332, 0, 0, 0, 1, 1, 1, 1, 'Abetment Bracers'), +(34142, 40333, 0, 0, 0, 1, 1, 1, 1, 'Leggings of Fleeting Moments'), +(34142, 40334, 0, 0, 0, 1, 1, 1, 1, 'Burdened Shoulderplates'), +(34142, 40335, 0, 0, 0, 1, 1, 1, 1, 'Touch of Horror'), +(34142, 40336, 0, 0, 0, 1, 1, 1, 1, 'Life and Death'), +(34142, 40337, 0, 0, 0, 1, 1, 1, 1, 'Libram of Resurgence'), +(34142, 40338, 0, 0, 0, 1, 1, 1, 1, 'Bindings of Yearning'), +(34142, 40339, 0, 0, 0, 1, 1, 1, 1, 'Gothik\'s Cowl'), +(34142, 40340, 0, 0, 0, 1, 1, 1, 1, 'Helm of Unleashed Energy'), +(34142, 40341, 0, 0, 0, 1, 1, 1, 1, 'Shackled Cinch'), +(34142, 40342, 0, 0, 0, 1, 1, 1, 1, 'Idol of Awakening'), +(34142, 40286, 0, 0, 0, 1, 1, 1, 1, 'Mantle of the Corrupted'), +(34142, 40343, 0, 0, 0, 1, 1, 1, 1, 'Armageddon'), +(34142, 40344, 0, 0, 0, 1, 1, 1, 1, 'Helm of the Grave'), +(34142, 40345, 0, 0, 0, 1, 1, 1, 1, 'Broken Promise'), +(34142, 40346, 0, 0, 0, 1, 1, 1, 1, 'Final Voyage'), +(34142, 40347, 0, 0, 0, 1, 1, 1, 1, 'Zeliek\'s Gauntlets'), +(34142, 40348, 0, 0, 0, 1, 1, 1, 1, 'Damnation'), +(34142, 40349, 0, 0, 0, 1, 1, 1, 1, 'Gloves of Peaceful Death'), +(34142, 40350, 0, 0, 0, 1, 1, 1, 1, 'Urn of Lost Memories'), +(34142, 40352, 0, 0, 0, 1, 1, 1, 1, 'Leggings of Voracious Shadows'), +(34142, 40184, 0, 0, 0, 1, 1, 1, 1, 'Crippled Treads'), +(34142, 40185, 0, 0, 0, 1, 1, 1, 1, 'Shoulderguards of Opportunity'), +(34142, 40186, 0, 0, 0, 1, 1, 1, 1, 'Thrusting Bands'), +(34142, 40187, 0, 0, 0, 1, 1, 1, 1, 'Poignant Sabatons'), +(34142, 40188, 0, 0, 0, 1, 1, 1, 1, 'Gauntlets of the Disobedient'), +(34142, 40189, 0, 0, 0, 1, 1, 1, 1, 'Angry Dread'), +(34142, 40190, 0, 0, 0, 1, 1, 1, 1, 'Spinning Fate'), +(34142, 40191, 0, 0, 0, 1, 1, 1, 1, 'Libram of Radiance'), +(34142, 40192, 0, 0, 0, 1, 1, 1, 1, 'Accursed Spine'), +(34142, 40193, 0, 0, 0, 1, 1, 1, 1, 'Tunic of Masked Suffering'), +(34142, 40196, 0, 0, 0, 1, 1, 1, 1, 'Legguards of the Undisturbed'), +(34142, 40197, 0, 0, 0, 1, 1, 1, 1, 'Gloves of the Fallen Wizard'), +(34142, 40198, 0, 0, 0, 1, 1, 1, 1, 'Bands of Impurity'), +(34142, 40200, 0, 0, 0, 1, 1, 1, 1, 'Belt of Potent Chanting'), +(34142, 40602, 0, 0, 0, 1, 1, 1, 1, 'Robes of Mutation'), +(34142, 40201, 0, 0, 0, 1, 1, 1, 1, 'Leggings of Colossal Strides'), +(34142, 40203, 0, 0, 0, 1, 1, 1, 1, 'Breastplate of Tormented Rage'), +(34142, 40204, 0, 0, 0, 1, 1, 1, 1, 'Legguards of the Apostle'), +(34142, 40205, 0, 0, 0, 1, 1, 1, 1, 'Stalk-Skin Belt'), +(34142, 40206, 0, 0, 0, 1, 1, 1, 1, 'Iron-Spring Jumpers'), +(34142, 40207, 0, 0, 0, 1, 1, 1, 1, 'Sigil of Awareness'), +(34142, 40208, 0, 0, 0, 1, 1, 1, 1, 'Cryptfiend\'s Bite'), +(34142, 40209, 0, 0, 0, 1, 1, 1, 1, 'Bindings of the Decrepit'), +(34142, 40210, 0, 0, 0, 1, 1, 1, 1, 'Chestguard of Bitter Charms'), +(34142, 40233, 0, 0, 0, 1, 1, 1, 1, 'The Undeath Carrier'), +(34142, 40234, 0, 0, 0, 1, 1, 1, 1, 'Heigan\'s Putrid Vestments'), +(34142, 40235, 0, 0, 0, 1, 1, 1, 1, 'Helm of Pilgrimage'), +(34142, 40236, 0, 0, 0, 1, 1, 1, 1, 'Serene Echoes'), +(34142, 40237, 0, 0, 0, 1, 1, 1, 1, 'Eruption-Scarred Boots'), +(34142, 40238, 0, 0, 0, 1, 1, 1, 1, 'Gloves of the Dancing Bear'), +(34142, 40239, 0, 0, 0, 1, 1, 1, 1, 'The Hand of Nerub'), +(34142, 40240, 0, 0, 0, 1, 1, 1, 1, 'Greaves of Turbulence'), +(34142, 40241, 0, 0, 0, 1, 1, 1, 1, 'Girdle of Unity'), +(34142, 40242, 0, 0, 0, 1, 1, 1, 1, 'Grotesque Handgrips'), +(34142, 40243, 0, 0, 0, 1, 1, 1, 1, 'Footwraps of Vile Deceit'), +(34142, 40244, 0, 0, 0, 1, 1, 1, 1, 'The Impossible Dream'), +(34142, 40245, 0, 0, 0, 1, 1, 1, 1, 'Fading Glow'), +(34142, 40246, 0, 0, 0, 1, 1, 1, 1, 'Boots of Impetuous Ideals'), +(34142, 40247, 0, 0, 0, 1, 1, 1, 1, 'Cowl of Innocent Delight'), +(34142, 40249, 0, 0, 0, 1, 1, 1, 1, 'Vest of Vitality'); +-- (34142, 40406, 0, 0, 0, 1, 1, 1, 1, 'Inevitable Defeat'), +-- (34142, 40407, 0, 0, 0, 1, 1, 1, 1, 'Silent Crusader'), +-- (34142, 40408, 0, 0, 0, 1, 1, 1, 1, 'Haunting Call'), +-- (34142, 40409, 0, 0, 0, 1, 1, 1, 1, 'Boots of the Escaped Captive'), +-- (34142, 40410, 0, 0, 0, 1, 1, 1, 1, 'Shadow of the Ghoul'), +-- (34142, 40412, 0, 0, 0, 1, 1, 1, 1, 'Ousted Bead Necklace'), +-- (34142, 40414, 0, 0, 0, 1, 1, 1, 1, 'Shoulderguards of the Undaunted'); From 9df01c67fab44a162dfef4da175814ab350714ec Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Thu, 26 Feb 2026 18:58:23 +0000 Subject: [PATCH 132/150] chore(DB): import pending files Referenced commit(s): 76ec5e39a0bb3b75b779501a854c83e8e669cab2 --- .../rev_1771283323680167400.sql => db_world/2026_02_26_05.sql} | 1 + 1 file changed, 1 insertion(+) rename data/sql/updates/{pending_db_world/rev_1771283323680167400.sql => db_world/2026_02_26_05.sql} (99%) diff --git a/data/sql/updates/pending_db_world/rev_1771283323680167400.sql b/data/sql/updates/db_world/2026_02_26_05.sql similarity index 99% rename from data/sql/updates/pending_db_world/rev_1771283323680167400.sql rename to data/sql/updates/db_world/2026_02_26_05.sql index aa3c47b12..fccdc9d88 100644 --- a/data/sql/updates/pending_db_world/rev_1771283323680167400.sql +++ b/data/sql/updates/db_world/2026_02_26_05.sql @@ -1,3 +1,4 @@ +-- DB update 2026_02_26_04 -> 2026_02_26_05 -- Gluth DELETE FROM `creature_loot_template` WHERE (`Entry` = 15932) AND `GroupId` = 2; INSERT INTO `creature_loot_template` (`Entry`, `Item`, `Reference`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES From 22dd44f4d1e6713bff0e712c6952c7e0c68ae9ab Mon Sep 17 00:00:00 2001 From: blinkysc <37940565+blinkysc@users.noreply.github.com> Date: Thu, 26 Feb 2026 16:36:23 -0600 Subject: [PATCH 133/150] fix(Core/Scripts): Remove duplicate spell scripts causing double-firing (#24905) Co-authored-by: blinkysc --- .../rev_1772139853408206022.sql | 8 +++ .../boss_deathbringer_saurfang.cpp | 43 ---------------- .../IcecrownCitadel/icecrown_citadel.cpp | 22 --------- .../BlackTemple/instance_black_temple.cpp | 24 --------- src/server/scripts/Spells/spell_item.cpp | 26 ---------- src/server/scripts/Spells/spell_paladin.cpp | 28 ----------- src/server/scripts/Spells/spell_priest.cpp | 33 ------------- src/server/scripts/Spells/spell_warlock.cpp | 49 ------------------- 8 files changed, 8 insertions(+), 225 deletions(-) create mode 100644 data/sql/updates/pending_db_world/rev_1772139853408206022.sql diff --git a/data/sql/updates/pending_db_world/rev_1772139853408206022.sql b/data/sql/updates/pending_db_world/rev_1772139853408206022.sql new file mode 100644 index 000000000..7d076608d --- /dev/null +++ b/data/sql/updates/pending_db_world/rev_1772139853408206022.sql @@ -0,0 +1,8 @@ +-- Remove duplicate spell scripts that caused handlers to fire twice +DELETE FROM `spell_script_names` WHERE `spell_id` = 54937 AND `ScriptName` = 'spell_pal_glyph_of_holy_light_proc'; +DELETE FROM `spell_script_names` WHERE `spell_id` = 41404 AND `ScriptName` = 'spell_black_temple_dementia_aura'; +DELETE FROM `spell_script_names` WHERE `spell_id` = 64440 AND `ScriptName` = 'spell_item_blade_ward_enchant'; +DELETE FROM `spell_script_names` WHERE `spell_id` = 37594 AND `ScriptName` = 'spell_pri_item_greater_heal_refund'; +DELETE FROM `spell_script_names` WHERE `spell_id` = 69483 AND `ScriptName` = 'spell_icc_dark_reckoning_aura'; +DELETE FROM `spell_script_names` WHERE `ScriptName` = 'spell_warl_demonic_pact_aura'; +DELETE FROM `spell_script_names` WHERE `spell_id` = 72176 AND `ScriptName` = 'spell_deathbringer_blood_link_blood_beast_aura'; diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_deathbringer_saurfang.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_deathbringer_saurfang.cpp index ded579444..ad895c564 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/boss_deathbringer_saurfang.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_deathbringer_saurfang.cpp @@ -1096,48 +1096,6 @@ class spell_deathbringer_blood_link_aura : public AuraScript } }; -class spell_deathbringer_blood_link_blood_beast_aura : public AuraScript -{ - PrepareAuraScript(spell_deathbringer_blood_link_blood_beast_aura); - - bool Validate(SpellInfo const* /*spellInfo*/) override - { - return ValidateSpellInfo({ SPELL_BLOOD_LINK_DUMMY }); - } - - bool CheckProc(ProcEventInfo& eventInfo) - { - DamageInfo* damageInfo = eventInfo.GetDamageInfo(); - SpellInfo const* procSpell = eventInfo.GetSpellInfo(); - return eventInfo.GetActor() && eventInfo.GetActionTarget() && ((damageInfo && damageInfo->GetDamage()) || eventInfo.GetHitMask() & PROC_EX_ABSORB) && (!procSpell || procSpell->SpellIconID != 2731); // Xinef: Mark of the Fallen Champion - } - - void HandleProc(AuraEffect const* /*aurEff*/, ProcEventInfo& eventInfo) - { - PreventDefaultAction(); - - /* - uint32 markCount = 0; - if (Map* map = eventInfo.GetActor()->FindMap()) - if (InstanceMap* imap = map->ToInstanceMap()) - if (InstanceScript* isc = imap->GetInstanceScript()) - if (ObjectGuid sguid = isc->GetGuidData(3) //DATA_DEATHBRINGER_SAURFANG - if (Creature* saurfang = ObjectAccessor::GetCreature(*eventInfo.GetActor(), sguid)) - markCount = saurfang->IsAIEnabled ? saurfang->AI()->GetData(123456) : 0; //FALLEN_CHAMPION_CAST_COUNT - */ - int32 basepoints = int32(3.0f /*+ 0.5f + 0.5f*markCount*/); - - eventInfo.GetActor()->CastCustomSpell(SPELL_BLOOD_LINK_DUMMY, SPELLVALUE_BASE_POINT0, basepoints, eventInfo.GetActionTarget(), true); - return; - } - - void Register() override - { - DoCheckProc += AuraCheckProcFn(spell_deathbringer_blood_link_blood_beast_aura::CheckProc); - OnEffectProc += AuraEffectProcFn(spell_deathbringer_blood_link_blood_beast_aura::HandleProc, EFFECT_0, SPELL_AURA_PROC_TRIGGER_SPELL); - } -}; - class spell_deathbringer_blood_link : public SpellScript { PrepareSpellScript(spell_deathbringer_blood_link); @@ -1371,7 +1329,6 @@ void AddSC_boss_deathbringer_saurfang() new npc_muradin_bronzebeard_icc(); new npc_saurfang_event(); RegisterSpellScript(spell_deathbringer_blood_link_aura); - RegisterSpellScript(spell_deathbringer_blood_link_blood_beast_aura); RegisterSpellScript(spell_deathbringer_blood_beast_blood_link); RegisterSpellScript(spell_deathbringer_blood_link); RegisterSpellAndAuraScriptPair(spell_deathbringer_blood_power, spell_deathbringer_blood_power_aura); diff --git a/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.cpp b/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.cpp index 8254ed5ef..1c1743841 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.cpp @@ -2295,27 +2295,6 @@ class spell_icc_web_wrap_aura : public AuraScript } }; -class spell_icc_dark_reckoning_aura : public AuraScript -{ - PrepareAuraScript(spell_icc_dark_reckoning_aura); - - bool Validate(SpellInfo const* /*spellInfo*/) override - { - return ValidateSpellInfo({ 69482 }); - } - - void OnPeriodic(AuraEffect const* /*aurEff*/) - { - if (Unit* caster = GetCaster()) - caster->CastSpell(GetTarget(), 69482, true); - } - - void Register() override - { - OnEffectPeriodic += AuraEffectPeriodicFn(spell_icc_dark_reckoning_aura::OnPeriodic, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY); - } -}; - class spell_stinky_precious_decimate : public SpellScript { PrepareSpellScript(spell_stinky_precious_decimate); @@ -3681,7 +3660,6 @@ void AddSC_icecrown_citadel() // pussywizard below: RegisterSpellScript(spell_icc_web_wrap_aura); - RegisterSpellScript(spell_icc_dark_reckoning_aura); RegisterSpellScript(spell_stinky_precious_decimate); RegisterSpellScript(spell_icc_yf_frozen_orb_aura); RegisterSpellScript(spell_icc_yh_volley_aura); diff --git a/src/server/scripts/Outland/BlackTemple/instance_black_temple.cpp b/src/server/scripts/Outland/BlackTemple/instance_black_temple.cpp index bbf157a1f..5d971da18 100644 --- a/src/server/scripts/Outland/BlackTemple/instance_black_temple.cpp +++ b/src/server/scripts/Outland/BlackTemple/instance_black_temple.cpp @@ -446,29 +446,6 @@ class spell_black_temple_curse_of_vitality_aura : public AuraScript } }; -class spell_black_temple_dementia_aura : public AuraScript -{ - PrepareAuraScript(spell_black_temple_dementia_aura); - - bool Validate(SpellInfo const* /*spellInfo*/) override - { - return ValidateSpellInfo({ SPELL_DEMENTIA1, SPELL_DEMENTIA2 }); - } - - void OnPeriodic(AuraEffect const* /*aurEff*/) - { - if (roll_chance_i(50)) - GetTarget()->CastSpell(GetTarget(), SPELL_DEMENTIA1, true); - else - GetTarget()->CastSpell(GetTarget(), SPELL_DEMENTIA2, true); - } - - void Register() override - { - OnEffectPeriodic += AuraEffectPeriodicFn(spell_black_temple_dementia_aura::OnPeriodic, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY); - } -}; - // 39649 - Summon Shadowfiends class spell_black_temple_summon_shadowfiends : public SpellScript { @@ -525,7 +502,6 @@ void AddSC_instance_black_temple() RegisterSpellScript(spell_black_temple_bloodbolt); RegisterSpellScript(spell_black_temple_consuming_strikes_aura); RegisterSpellScript(spell_black_temple_curse_of_vitality_aura); - RegisterSpellScript(spell_black_temple_dementia_aura); RegisterSpellScript(spell_black_temple_summon_shadowfiends); RegisterSpellScript(spell_black_temple_l5_arcane_charge); } diff --git a/src/server/scripts/Spells/spell_item.cpp b/src/server/scripts/Spells/spell_item.cpp index 0fd4e999a..a9a430cf1 100644 --- a/src/server/scripts/Spells/spell_item.cpp +++ b/src/server/scripts/Spells/spell_item.cpp @@ -1206,31 +1206,6 @@ class spell_item_trauma : public AuraScript } }; -class spell_item_blade_ward_enchant : public AuraScript -{ - PrepareAuraScript(spell_item_blade_ward_enchant); - - void HandleProc(AuraEffect const* /*aurEff*/, ProcEventInfo& eventInfo) - { - PreventDefaultAction(); - if (!eventInfo.GetActionTarget()) - { - return; - } - - if (SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(64442 /*SPELL_BLADE_WARDING*/)) - { - int32 basepoints = spellInfo->Effects[EFFECT_0].CalcValue() * this->GetStackAmount(); - eventInfo.GetActionTarget()->CastCustomSpell(spellInfo->Id, SPELLVALUE_BASE_POINT0, basepoints, eventInfo.GetActor(), true); - } - } - - void Register() override - { - OnEffectProc += AuraEffectProcFn(spell_item_blade_ward_enchant::HandleProc, EFFECT_1, SPELL_AURA_PROC_TRIGGER_SPELL); - } -}; - class spell_item_blood_draining_enchant : public AuraScript { PrepareAuraScript(spell_item_blood_draining_enchant); @@ -6236,7 +6211,6 @@ void AddSC_item_spell_scripts() RegisterSpellScript(spell_item_fetch_ball); RegisterSpellScript(spell_item_oracle_ablutions); RegisterSpellScript(spell_item_trauma); - RegisterSpellScript(spell_item_blade_ward_enchant); RegisterSpellScript(spell_item_blood_draining_enchant); RegisterSpellScript(spell_item_dragon_kite_summon_lightning_bunny); RegisterSpellScript(spell_item_enchanted_broom_periodic); diff --git a/src/server/scripts/Spells/spell_paladin.cpp b/src/server/scripts/Spells/spell_paladin.cpp index 8b9dc5c44..a9f8ebfe1 100644 --- a/src/server/scripts/Spells/spell_paladin.cpp +++ b/src/server/scripts/Spells/spell_paladin.cpp @@ -1404,33 +1404,6 @@ class spell_pal_spiritual_attunement : public AuraScript } }; -// 54937 - Glyph of Holy Light (proc trigger) -class spell_pal_glyph_of_holy_light_proc : public AuraScript -{ - PrepareAuraScript(spell_pal_glyph_of_holy_light_proc); - - bool Validate(SpellInfo const* /*spellInfo*/) override - { - return ValidateSpellInfo({ SPELL_PALADIN_GLYPH_OF_HOLY_LIGHT_HEAL }); - } - - void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) - { - PreventDefaultAction(); - HealInfo* healInfo = eventInfo.GetHealInfo(); - if (!healInfo || !healInfo->GetHeal()) - return; - - int32 bp = CalculatePct(int32(healInfo->GetHeal()), aurEff->GetAmount()); - GetTarget()->CastCustomSpell(SPELL_PALADIN_GLYPH_OF_HOLY_LIGHT_HEAL, SPELLVALUE_BASE_POINT0, bp, eventInfo.GetActionTarget(), true, nullptr, aurEff); - } - - void Register() override - { - OnEffectProc += AuraEffectProcFn(spell_pal_glyph_of_holy_light_proc::HandleProc, EFFECT_0, SPELL_AURA_DUMMY); - } -}; - // 1022 - Hand of Protection class spell_pal_hand_of_protection : public SpellScript { @@ -2209,7 +2182,6 @@ void AddSC_paladin_spell_scripts() RegisterSpellScript(spell_pal_judgement_of_light_heal); RegisterSpellScript(spell_pal_judgement_of_wisdom_mana); RegisterSpellScript(spell_pal_spiritual_attunement); - RegisterSpellScript(spell_pal_glyph_of_holy_light_proc); RegisterSpellScript(spell_pal_t3_6p_bonus); RegisterSpellScript(spell_pal_t8_2p_bonus); RegisterSpellScript(spell_pal_glyph_of_divinity); diff --git a/src/server/scripts/Spells/spell_priest.cpp b/src/server/scripts/Spells/spell_priest.cpp index a5df31868..223a5d52a 100644 --- a/src/server/scripts/Spells/spell_priest.cpp +++ b/src/server/scripts/Spells/spell_priest.cpp @@ -360,38 +360,6 @@ class spell_pri_hymn_of_hope : public SpellScript } }; -// 37594 - Greater Heal Refund -class spell_pri_item_greater_heal_refund : public AuraScript -{ - PrepareAuraScript(spell_pri_item_greater_heal_refund); - - bool Validate(SpellInfo const* /*spellInfo*/) override - { - return ValidateSpellInfo({ SPELL_PRIEST_ITEM_EFFICIENCY }); - } - - bool CheckProc(ProcEventInfo& eventInfo) - { - if (HealInfo* healInfo = eventInfo.GetHealInfo()) - if (Unit* healTarget = healInfo->GetTarget()) - if (eventInfo.GetHitMask() & PROC_EX_NO_OVERHEAL && healTarget->IsFullHealth()) - return true; - return false; - } - - void HandleProc(AuraEffect const* aurEff, ProcEventInfo& /*eventInfo*/) - { - PreventDefaultAction(); - GetTarget()->CastSpell(GetTarget(), SPELL_PRIEST_ITEM_EFFICIENCY, true, nullptr, aurEff); - } - - void Register() override - { - DoCheckProc += AuraCheckProcFn(spell_pri_item_greater_heal_refund::CheckProc); - OnEffectProc += AuraEffectProcFn(spell_pri_item_greater_heal_refund::HandleProc, EFFECT_0, SPELL_AURA_PROC_TRIGGER_SPELL); - } -}; - // 60123 - Lightwell class spell_pri_lightwell : public SpellScript { @@ -1448,7 +1416,6 @@ void AddSC_priest_spell_scripts() RegisterSpellScript(spell_pri_glyph_of_prayer_of_healing); RegisterSpellScript(spell_pri_guardian_spirit); RegisterSpellScript(spell_pri_hymn_of_hope); - RegisterSpellScript(spell_pri_item_greater_heal_refund); RegisterSpellScript(spell_pri_lightwell); RegisterSpellScript(spell_pri_lightwell_renew); RegisterSpellScript(spell_pri_mana_burn); diff --git a/src/server/scripts/Spells/spell_warlock.cpp b/src/server/scripts/Spells/spell_warlock.cpp index 95c2929a3..b7b09b350 100644 --- a/src/server/scripts/Spells/spell_warlock.cpp +++ b/src/server/scripts/Spells/spell_warlock.cpp @@ -1306,54 +1306,6 @@ class spell_warl_voidwalker_pet_passive : public AuraScript } }; -// 54909, 53646 - Demonic Pact -class spell_warl_demonic_pact_aura : public AuraScript -{ - PrepareAuraScript(spell_warl_demonic_pact_aura); - - bool Validate(SpellInfo const* /*spellInfo*/) override - { - return ValidateSpellInfo({ SPELL_WARLOCK_DEMONIC_PACT_PROC }); - } - - bool AfterCheckProc(ProcEventInfo& eventInfo, bool isTriggeredAtSpellProcEvent) - { - return isTriggeredAtSpellProcEvent && eventInfo.GetActor() && eventInfo.GetActor()->IsPet(); - } - - void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) - { - PreventDefaultAction(); - - if (eventInfo.GetActor()->HasSpellCooldown(aurEff->GetId())) - return; - - if (Unit* owner = eventInfo.GetActor()->GetOwner()) - { - int32 currentBonus = 0; - if (AuraEffect* demonicAurEff = owner->GetAuraEffect(SPELL_WARLOCK_DEMONIC_PACT_PROC, EFFECT_0)) - { - currentBonus = demonicAurEff->GetAmount(); - } - - if (AuraEffect* talentAurEff = owner->GetDummyAuraEffect(SPELLFAMILY_WARLOCK, WARLOCK_ICON_ID_DEMONIC_PACT, EFFECT_0)) - { - int32 spellDamageMinusBonus = owner->SpellBaseDamageBonusDone(SPELL_SCHOOL_MASK_MAGIC) - currentBonus; - if (spellDamageMinusBonus < 0) - return; - int32 bp = int32((talentAurEff->GetAmount() / 100.0f) * spellDamageMinusBonus); - owner->CastCustomSpell((Unit*)nullptr, SPELL_WARLOCK_DEMONIC_PACT_PROC, &bp, &bp, 0, true, nullptr, talentAurEff); - eventInfo.GetActor()->AddSpellCooldown(aurEff->GetId(), 0, eventInfo.GetProcCooldown()); - } - } - } - - void Register() override - { - OnEffectProc += AuraEffectProcFn(spell_warl_demonic_pact_aura::HandleProc, EFFECT_0, SPELL_AURA_PROC_TRIGGER_SPELL); - } -}; - // -980 - Curse of Agony class spell_warl_curse_of_agony : public AuraScript { @@ -1861,7 +1813,6 @@ void AddSC_warlock_spell_scripts() RegisterSpellScript(spell_warl_drain_soul); RegisterSpellScript(spell_warl_shadowburn); RegisterSpellScript(spell_warl_voidwalker_pet_passive); - RegisterSpellScript(spell_warl_demonic_pact_aura); RegisterSpellScript(spell_warl_curse_of_agony); RegisterSpellScript(spell_warl_glyph_of_corruption_nightfall); RegisterSpellScript(spell_warl_nightfall); From 5adb7e07e81ad757abd78fb217188c3580cbf292 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Thu, 26 Feb 2026 22:37:31 +0000 Subject: [PATCH 134/150] chore(DB): import pending files Referenced commit(s): 22dd44f4d1e6713bff0e712c6952c7e0c68ae9ab --- .../rev_1772139853408206022.sql => db_world/2026_02_26_06.sql} | 1 + 1 file changed, 1 insertion(+) rename data/sql/updates/{pending_db_world/rev_1772139853408206022.sql => db_world/2026_02_26_06.sql} (95%) diff --git a/data/sql/updates/pending_db_world/rev_1772139853408206022.sql b/data/sql/updates/db_world/2026_02_26_06.sql similarity index 95% rename from data/sql/updates/pending_db_world/rev_1772139853408206022.sql rename to data/sql/updates/db_world/2026_02_26_06.sql index 7d076608d..8108b3dbd 100644 --- a/data/sql/updates/pending_db_world/rev_1772139853408206022.sql +++ b/data/sql/updates/db_world/2026_02_26_06.sql @@ -1,3 +1,4 @@ +-- DB update 2026_02_26_05 -> 2026_02_26_06 -- Remove duplicate spell scripts that caused handlers to fire twice DELETE FROM `spell_script_names` WHERE `spell_id` = 54937 AND `ScriptName` = 'spell_pal_glyph_of_holy_light_proc'; DELETE FROM `spell_script_names` WHERE `spell_id` = 41404 AND `ScriptName` = 'spell_black_temple_dementia_aura'; From 424f97208a04546a3f83bfe0a287b1c35a89287f Mon Sep 17 00:00:00 2001 From: blinkysc <37940565+blinkysc@users.noreply.github.com> Date: Thu, 26 Feb 2026 18:52:50 -0600 Subject: [PATCH 135/150] fix(Core/Spells): Allow Mutilate offhand to proc Focused Attacks (#24907) --- .../rev_1772144945706318839.sql | 7 ++++++ src/server/scripts/Spells/spell_rogue.cpp | 25 +++++++++++++++++++ 2 files changed, 32 insertions(+) create mode 100644 data/sql/updates/pending_db_world/rev_1772144945706318839.sql diff --git a/data/sql/updates/pending_db_world/rev_1772144945706318839.sql b/data/sql/updates/pending_db_world/rev_1772144945706318839.sql new file mode 100644 index 000000000..f243d2ffe --- /dev/null +++ b/data/sql/updates/pending_db_world/rev_1772144945706318839.sql @@ -0,0 +1,7 @@ +-- Replace generic no-offhand-proc with Focused Attacks-specific script +-- that only blocks Fan of Knives offhand from proccing, allowing Mutilate +-- offhand and other offhand attacks to proc normally +DELETE FROM `spell_script_names` WHERE `spell_id` = -51634 AND `ScriptName` = 'spell_gen_no_offhand_proc'; +DELETE FROM `spell_script_names` WHERE `spell_id` = -51634 AND `ScriptName` = 'spell_rog_focused_attacks'; +INSERT INTO `spell_script_names` (`spell_id`, `ScriptName`) VALUES +(-51634, 'spell_rog_focused_attacks'); diff --git a/src/server/scripts/Spells/spell_rogue.cpp b/src/server/scripts/Spells/spell_rogue.cpp index 832ec5c35..a234dbb5d 100644 --- a/src/server/scripts/Spells/spell_rogue.cpp +++ b/src/server/scripts/Spells/spell_rogue.cpp @@ -1062,6 +1062,30 @@ class spell_rog_turn_the_tables_proc : public SpellScript } }; +// -51634 - Focused Attacks +// Block Fan of Knives offhand from proccing +class spell_rog_focused_attacks : public AuraScript +{ + PrepareAuraScript(spell_rog_focused_attacks); + + bool CheckProc(ProcEventInfo& eventInfo) + { + // Block Fan of Knives offhand (0x40000) from proccing + SpellInfo const* spellInfo = eventInfo.GetSpellInfo(); + if (spellInfo && spellInfo->SpellFamilyName == SPELLFAMILY_ROGUE + && (spellInfo->SpellFamilyFlags[1] & 0x40000) + && (eventInfo.GetTypeMask() & PROC_FLAG_DONE_OFFHAND_ATTACK)) + return false; + + return true; + } + + void Register() override + { + DoCheckProc += AuraCheckProcFn(spell_rog_focused_attacks::CheckProc); + } +}; + void AddSC_rogue_spell_scripts() { RegisterSpellScript(spell_rog_savage_combat); @@ -1092,4 +1116,5 @@ void AddSC_rogue_spell_scripts() RegisterSpellAndAuraScriptPair(spell_rog_honor_among_thieves_proc, spell_rog_honor_among_thieves_proc_aura); RegisterSpellScript(spell_rog_turn_the_tables); RegisterSpellScript(spell_rog_turn_the_tables_proc); + RegisterSpellScript(spell_rog_focused_attacks); } From 672d44b862acd9086c295061cffba662633fbd84 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Fri, 27 Feb 2026 00:54:04 +0000 Subject: [PATCH 136/150] chore(DB): import pending files Referenced commit(s): 424f97208a04546a3f83bfe0a287b1c35a89287f --- .../rev_1772144945706318839.sql => db_world/2026_02_27_00.sql} | 1 + 1 file changed, 1 insertion(+) rename data/sql/updates/{pending_db_world/rev_1772144945706318839.sql => db_world/2026_02_27_00.sql} (92%) diff --git a/data/sql/updates/pending_db_world/rev_1772144945706318839.sql b/data/sql/updates/db_world/2026_02_27_00.sql similarity index 92% rename from data/sql/updates/pending_db_world/rev_1772144945706318839.sql rename to data/sql/updates/db_world/2026_02_27_00.sql index f243d2ffe..dcc7aef2a 100644 --- a/data/sql/updates/pending_db_world/rev_1772144945706318839.sql +++ b/data/sql/updates/db_world/2026_02_27_00.sql @@ -1,3 +1,4 @@ +-- DB update 2026_02_26_06 -> 2026_02_27_00 -- Replace generic no-offhand-proc with Focused Attacks-specific script -- that only blocks Fan of Knives offhand from proccing, allowing Mutilate -- offhand and other offhand attacks to proc normally From 9f79d53b6634f28e79ffe427a2e58754be70595a Mon Sep 17 00:00:00 2001 From: sudlud Date: Fri, 27 Feb 2026 13:33:09 +0100 Subject: [PATCH 137/150] =?UTF-8?q?fix(DB/Creature):=20Sniffed=20Values=20?= =?UTF-8?q?for=20'Day=20of=20the=20Dead=20Celebrants=20and=20=E2=80=A6=20(?= =?UTF-8?q?#24856)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../rev_1771915997105053200.sql | 146 ++++++++++++++++++ 1 file changed, 146 insertions(+) create mode 100644 data/sql/updates/pending_db_world/rev_1771915997105053200.sql diff --git a/data/sql/updates/pending_db_world/rev_1771915997105053200.sql b/data/sql/updates/pending_db_world/rev_1771915997105053200.sql new file mode 100644 index 000000000..cab89e1ec --- /dev/null +++ b/data/sql/updates/pending_db_world/rev_1771915997105053200.sql @@ -0,0 +1,146 @@ +-- Update creature 'Day of the Dead Celebrants and Spirits' with sniffed values +-- updated spawns +DELETE FROM `creature` WHERE (`id1` IN (35250, 34479, 35243, 35249, 35253, 35251, 34483, 34482, 34435, 34477, 35256, 35254, 35244, 34476, 34480, 35252, 34484, 35246, 35260, 35261, 35258, 35259, 34481, 34478, 35247, 35248)) AND (`guid` IN (240194, 240195, 240196, 240197, 240198, 240199, 240200, 240201, 240202, 240203, 240204, 240205, 240206, 240207, 240208, 240209, 240210, 240211, 240212, 240213, 240214, 240215, 240216, 240217, 240218, 240219, 240220, 240221, 240222, 240223, 240224, 240225, 240230, 240231, 240232, 240233, 240234, 240235, 240236, 240237, 240238, 240239, 240240, 240242, 240243, 240244, 240245, 240246, 240247, 240248, 240249, 240250, 240267, 240268, 240269, 240270, 240271, 240272, 240273, 240274, 240275, 240276, 240277, 240278, 240279, 240280, 240281, 240282, 240283, 240284, 240285, 240286, 240287, 240288, 240289, 240290, 240291, 240292, 240293, 240294, 240295, 240296, 240297, 240298, 240299, 240300, 240301, 240302, 240339, 240340)); +INSERT INTO `creature` (`guid`, `id1`, `map`, `spawnMask`, `phaseMask`, `equipment_id`, `position_x`, `position_y`, `position_z`, `orientation`, `spawntimesecs`, `wander_distance`, `MovementType`, `npcflag`, `unit_flags`, `dynamicflags`, `ScriptName`, `VerifiedBuild`, `CreateObject`, `Comment`) VALUES +(240194, 35250, 1, 1, 1, 0, 10043.6669921875, 2113.713623046875, 1329.7412109375, 1.274090290069580078, 120, 0, 0, 0, 0, 0, "", 51943, 1, NULL), +(240195, 35250, 1, 1, 1, 0, 10051.814453125, 2133.114501953125, 1329.7408447265625, 3.490658521652221679, 120, 0, 0, 0, 0, 0, "", 51943, 1, NULL), +(240196, 35250, 1, 1, 1, 0, 10045.91015625, 2116.8681640625, 1329.798828125, 3.909537553787231445, 120, 0, 0, 0, 0, 0, "", 51943, 1, NULL), +(240197, 35250, 1, 1, 1, 0, 10055.6962890625, 2118.001708984375, 1329.921630859375, 0.663225114345550537, 120, 0, 0, 0, 0, 0, "", 51943, 1, NULL), +(240198, 35250, 1, 1, 1, 0, 10059.9599609375, 2132.404541015625, 1329.7412109375, 3.839724302291870117, 120, 0, 0, 0, 0, 0, "", 51943, 1, NULL), +(240199, 35250, 1, 1, 1, 0, 10055.529296875, 2123.998291015625, 1329.8065185546875, 1.274090290069580078, 120, 0, 0, 0, 0, 0, "", 51943, 1, NULL), +(240200, 35250, 1, 1, 1, 0, 10051.5224609375, 2114.09375, 1329.7943115234375, 1.29154360294342041, 120, 0, 0, 0, 0, 0, "", 51943, 1, NULL), +(240201, 34479, 1, 1, 1, 0, 10055.2470703125, 2133.329833984375, 1329.7412109375, 3.159045934677124023, 120, 0, 0, 0, 0, 0, "", 51943, 1, NULL), +(240202, 35243, 530, 1, 1, 0, 9403.03515625, -6833.92529296875, 16.70704078674316406, 0.541052043437957763, 120, 0, 0, 0, 0, 0, "", 51943, 1, NULL), +(240203, 35243, 530, 1, 1, 0, 9406.4033203125, -6845.60791015625, 16.06168174743652343, 3.996803998947143554, 120, 0, 0, 0, 0, 0, "", 51943, 1, NULL), +(240204, 35243, 530, 1, 1, 0, 9407.63671875, -6826.66650390625, 17.45138931274414062, 4.450589656829833984, 120, 0, 0, 0, 0, 0, "", 51943, 1, NULL), +(240205, 35243, 530, 1, 1, 0, 9409.37109375, -6860.70654296875, 14.8249359130859375, 1.640609502792358398, 120, 0, 0, 0, 0, 0, "", 51943, 1, NULL), +(240206, 35249, 0, 1, 1, 0, -9349.6611328125, 175.8524322509765625, 61.64120864868164062, 0.48869219422340393, 120, 0, 0, 0, 0, 0, "", 51943, 1, NULL), +(240207, 35253, 1, 1, 1, 0, 1174.734375, -4465.51416015625, 21.36942481994628906, 1.745329260826110839, 120, 0, 0, 0, 0, 0, "", 51943, 1, NULL), +(240208, 35253, 1, 1, 1, 0, 1181.6041259765625, -4467.734375, 21.3765869140625, 3.787364482879638671, 120, 0, 0, 0, 0, 0, "", 51943, 1, NULL), +(240209, 35253, 1, 1, 1, 0, 1181.796875, -4458.68408203125, 21.44613838195800781, 1.832595705986022949, 120, 0, 0, 0, 0, 0, "", 51943, 1, NULL), +(240210, 35253, 1, 1, 1, 0, 1175.84375, -4458.7900390625, 21.59824943542480468, 1.064650893211364746, 120, 0, 0, 0, 0, 0, "", 51943, 1, NULL), +(240211, 35251, 1, 1, 1, 0, 1170.4478759765625, -4461.51025390625, 21.47426605224609375, 6.17846536636352539, 120, 0, 0, 0, 0, 0, "", 51943, 1, NULL), +(240212, 35251, 1, 1, 1, 0, 1172.79345703125, -4455.80908203125, 21.683502197265625, 0.069813169538974761, 120, 0, 0, 0, 0, 0, "", 51943, 1, NULL), +(240213, 34483, 530, 1, 1, 0, 9417.505859375, -6851.2099609375, 15.09478092193603515, 3.420845270156860351, 120, 0, 0, 0, 0, 0, "", 51943, 1, NULL), +(240214, 35243, 530, 1, 1, 0, 9406.1298828125, -6857.921875, 15.11687183380126953, 0.226892799139022827, 120, 0, 0, 0, 0, 0, "", 51943, 1, NULL), +(240215, 35243, 530, 1, 1, 0, 9403.6708984375, -6849.658203125, 15.91330623626708984, 1.169370532035827636, 120, 0, 0, 0, 0, 0, "", 51943, 1, NULL), +(240216, 35249, 0, 1, 1, 0, -9328.5595703125, 163.611114501953125, 61.89540481567382812, 2.548180580139160156, 120, 0, 0, 0, 0, 0, "", 51943, 1, NULL), +(240217, 35249, 0, 1, 1, 0, -9332.03515625, 170.70660400390625, 61.70401382446289062, 1.308996915817260742, 120, 0, 0, 0, 0, 0, "", 51943, 1, NULL), +(240218, 35249, 0, 1, 1, 0, -9336.9580078125, 174.185760498046875, 61.64844512939453125, 0.733038306236267089, 120, 0, 0, 0, 0, 0, "", 51943, 1, NULL), +(240219, 35249, 0, 1, 1, 0, -9328.5556640625, 185.888885498046875, 62.81067657470703125, 4.206243515014648437, 120, 0, 0, 0, 0, 0, "", 51943, 1, NULL), +(240220, 35249, 0, 1, 1, 0, -9324.376953125, 176.2569427490234375, 61.75640869140625, 4.363323211669921875, 120, 0, 0, 0, 0, 0, "", 51943, 1, NULL), +(240221, 35249, 0, 1, 1, 0, -9321.2939453125, 172.7256927490234375, 61.70332717895507812, 4.066617012023925781, 120, 0, 0, 0, 0, 0, "", 51943, 1, NULL), +(240222, 35249, 0, 1, 1, 0, -9346.34375, 177.373260498046875, 61.64120864868164062, 3.560471534729003906, 120, 0, 0, 0, 0, 0, "", 51943, 1, NULL), +(240223, 35249, 0, 1, 1, 0, -9343.953125, 186.0885467529296875, 61.64120864868164062, 4.939281940460205078, 120, 0, 0, 0, 0, 0, "", 51943, 1, NULL), +(240224, 35249, 0, 1, 1, 0, -9348.5625, 171.079864501953125, 61.64120864868164062, 4.15388345718383789, 120, 0, 0, 0, 0, 0, "", 51943, 1, NULL), +(240225, 35249, 0, 1, 1, 0, -9325.70703125, 167.404510498046875, 61.66920089721679687, 2.94960641860961914, 120, 0, 0, 0, 0, 0, "", 51943, 1, NULL), +(240230, 34482, 1, 1, 1, 0, 1178.8629150390625, -4471.86962890625, 21.17310333251953125, 1.378810048103332519, 120, 0, 0, 0, 0, 0, "", 51943, 1, NULL), +(240231, 34435, 0, 1, 1, 0, -9338.0263671875, 186.1354217529296875, 61.62332534790039062, 4.206243515014648437, 120, 0, 0, 0, 0, 0, "", 51943, 1, NULL), +(240232, 34477, 1, 1, 1, 0, 1186.829833984375, -4472.38720703125, 21.49950408935546875, 1.692969322204589843, 120, 0, 0, 0, 0, 0, "", 51943, 1, NULL), +(240233, 35256, 571, 1, 1, 0, 5855.5380859375, 766.54864501953125, 641.56671142578125, 3.787364482879638671, 120, 0, 0, 0, 0, 0, "", 46368, 1, NULL), +(240234, 35254, 571, 1, 1, 0, 5850.15283203125, 769.9913330078125, 640.817626953125, 3.106686115264892578, 120, 0, 0, 0, 0, 0, "", 46368, 1, NULL), +(240235, 35254, 571, 1, 1, 0, 5847.70751953125, 772.88543701171875, 640.46234130859375, 4.939281940460205078, 120, 0, 0, 0, 0, 0, "", 46368, 1, NULL), +(240236, 35254, 571, 1, 1, 0, 5850.7265625, 774.95831298828125, 640.53619384765625, 4.590215682983398437, 120, 0, 0, 0, 0, 0, "", 46368, 1, NULL), +(240237, 35254, 571, 1, 1, 0, 5854.5625, 769.9375, 641.3104248046875, 4.15388345718383789, 120, 0, 0, 0, 0, 0, "", 46368, 1, NULL), +(240238, 35254, 571, 1, 1, 0, 5854.24462890625, 762.48089599609375, 641.18548583984375, 3.31612563133239746, 120, 0, 0, 0, 0, 0, "", 46368, 1, NULL), +(240239, 35254, 571, 1, 1, 0, 5848.58056640625, 770.54339599609375, 640.6075439453125, 5.445427417755126953, 120, 0, 0, 0, 0, 0, "", 46368, 1, NULL), +(240240, 35254, 571, 1, 1, 0, 5858.05126953125, 763.140625, 640.97076416015625, 2.548180580139160156, 120, 0, 0, 0, 0, 0, "", 46368, 1, NULL), +(240242, 35254, 571, 1, 1, 0, 5860.416015625, 765.40802001953125, 640.8057861328125, 4.066617012023925781, 120, 0, 0, 0, 0, 0, "", 46368, 1, NULL), +(240243, 35254, 571, 1, 1, 0, 5856.31591796875, 764, 641.2667236328125, 6.038839340209960937, 120, 0, 0, 0, 0, 0, "", 46368, 1, NULL), +(240244, 35244, 0, 1, 1, 0, 1831.29345703125, 213.154510498046875, 60.45892333984375, 3.647738218307495117, 120, 0, 0, 0, 0, 0, "", 51943, 1, NULL), +(240245, 35244, 0, 1, 1, 0, 1830.107666015625, 221.470489501953125, 60.79235076904296875, 2.635447263717651367, 120, 0, 0, 0, 0, 0, "", 51943, 1, NULL), +(240246, 35244, 0, 1, 1, 0, 1824.79345703125, 210.56597900390625, 60.20412826538085937, 0.226892799139022827, 120, 0, 0, 0, 0, 0, "", 51943, 1, NULL), +(240247, 35244, 0, 1, 1, 0, 1835.3680419921875, 257.9600830078125, 59.87485122680664062, 4.049163818359375, 120, 0, 0, 0, 0, 0, "", 51943, 1, NULL), +(240248, 35244, 0, 1, 1, 0, 1833.7899169921875, 247.517364501953125, 59.9253387451171875, 2.0245819091796875, 120, 0, 0, 0, 0, 0, "", 51943, 1, NULL), +(240249, 35244, 0, 1, 1, 0, 1820.8680419921875, 261.94964599609375, 60.06829833984375, 0.104719758033752441, 120, 0, 0, 0, 0, 0, "", 51943, 1, NULL), +(240250, 34476, 0, 1, 1, 0, 1778.5364990234375, 218.2413177490234375, 59.76784896850585937, 1.082104086875915527, 120, 0, 0, 0, 0, 0, "", 51943, 1, NULL), +(240267, 34480, 1, 1, 1, 0, -979.08856201171875, -79.9652786254882812, 19.96615791320800781, 1.064650893211364746, 120, 0, 0, 0, 0, 0, "", 51943, 1, NULL), +(240268, 35252, 1, 1, 1, 0, -978.95660400390625, -65.2430572509765625, 21.8000946044921875, 0.453785598278045654, 120, 0, 0, 0, 0, 0, "", 51943, 1, NULL), +(240269, 35252, 1, 1, 1, 0, -983.6180419921875, -74.5416641235351562, 20.65581512451171875, 0.366519153118133544, 120, 0, 0, 0, 0, 0, "", 51943, 1, NULL), +(240270, 35252, 1, 1, 1, 0, -974.638916015625, -84.0590286254882812, 20.59402084350585937, 1.274090290069580078, 120, 0, 0, 0, 0, 0, "", 51943, 1, NULL), +(240271, 35252, 1, 1, 1, 0, -976.685791015625, -67.859375, 19.32087326049804687, 3.996803998947143554, 120, 0, 0, 0, 0, 0, "", 51943, 1, NULL), +(240272, 35252, 1, 1, 1, 0, -981.70831298828125, -76.1371536254882812, 20.18576431274414062, 4.066617012023925781, 120, 0, 0, 0, 0, 0, "", 51943, 1, NULL), +(240273, 34484, 530, 1, 1, 0, -4307.6318359375, -12420.607421875, 17.64993476867675781, 4.921828269958496093, 120, 0, 0, 0, 0, 0, "", 51943, 1, NULL), +(240274, 35246, 530, 1, 1, 0, -4324.26416015625, -12444.34375, 17.27714729309082031, 4.398229598999023437, 120, 0, 0, 0, 0, 0, "", 51943, 1, NULL), +(240275, 35246, 530, 1, 1, 0, -4322.69970703125, -12456.544921875, 17.44094657897949218, 6.0737457275390625, 120, 0, 0, 0, 0, 0, "", 51943, 1, NULL), +(240276, 35246, 530, 1, 1, 0, -4320.296875, -12438.9267578125, 17.69791793823242187, 5.410520553588867187, 120, 0, 0, 0, 0, 0, "", 51943, 1, NULL), +(240277, 35246, 530, 1, 1, 0, -4322.423828125, -12449.6181640625, 16.97788047790527343, 6.2657318115234375, 120, 0, 0, 0, 0, 0, "", 51943, 1, NULL), +(240278, 35246, 530, 1, 1, 0, -4308.39404296875, -12429.40625, 17.04607200622558593, 4.206243515014648437, 120, 0, 0, 0, 0, 0, "", 51943, 1, NULL), +(240279, 35246, 530, 1, 1, 0, -4312.236328125, -12434.603515625, 17.15652656555175781, 3.31612563133239746, 120, 0, 0, 0, 0, 0, "", 51943, 1, NULL), +(240280, 35246, 530, 1, 1, 0, -4314.046875, -12441.451171875, 17.30897712707519531, 4.537856101989746093, 120, 0, 0, 0, 0, 0, "", 51943, 1, NULL), +(240281, 35246, 530, 1, 1, 0, -4314.90625, -12430.2880859375, 17.558502197265625, 3.438298702239990234, 120, 0, 0, 0, 0, 0, "", 51943, 1, NULL), +(240282, 35260, 530, 1, 1, 0, -1784.904541015625, 4934.78662109375, -22.4792404174804687, 3.543018341064453125, 120, 0, 0, 0, 0, 0, "", 51943, 1, NULL), +(240283, 35261, 530, 1, 1, 0, -1801.1197509765625, 4913.8818359375, -21.8948688507080078, 2.268928050994873046, 120, 0, 0, 0, 0, 0, "", 51943, 1, NULL), +(240284, 35258, 530, 1, 1, 0, -1781.51220703125, 4932.91845703125, -22.36956787109375, 3.857177734375, 120, 0, 0, 0, 0, 0, "", 51943, 1, NULL), +(240285, 35258, 530, 1, 1, 0, -1824.8941650390625, 4920.689453125, -21.8328437805175781, 1.01229095458984375, 120, 0, 0, 0, 0, 0, "", 51943, 1, NULL), +(240286, 35258, 530, 1, 1, 0, -1828.8385009765625, 4923.3515625, -21.8637142181396484, 1.064650893211364746, 120, 0, 0, 0, 0, 0, "", 51943, 1, NULL), +(240287, 35258, 530, 1, 1, 0, -1785.263916015625, 4938.56494140625, -22.5346794128417968, 3.281219005584716796, 120, 0, 0, 0, 0, 0, "", 51943, 1, NULL), +(240288, 35259, 530, 1, 1, 0, -1803.53125, 4911.09716796875, -21.7488002777099609, 2.740166902542114257, 120, 0, 0, 0, 0, 0, "", 51943, 1, NULL), +(240289, 35259, 530, 1, 1, 0, -1792, 4913.0546875, -21.3998279571533203, 2.007128715515136718, 120, 0, 0, 0, 0, 0, "", 51943, 1, NULL), +(240290, 35259, 530, 1, 1, 0, -1797.486083984375, 4914.01025390625, -21.7077884674072265, 1.500983119010925292, 120, 0, 0, 0, 0, 0, "", 51943, 1, NULL), +(240291, 35259, 530, 1, 1, 0, -1794.4617919921875, 4911.29345703125, -21.4007549285888671, 2.111848354339599609, 120, 0, 0, 0, 0, 0, "", 51943, 1, NULL), +(240292, 34481, 0, 1, 1, 0, -5166.08154296875, -881.12677001953125, 507.390594482421875, 1.082104086875915527, 120, 0, 0, 0, 0, 0, "", 51943, 1, NULL), +(240293, 34478, 0, 1, 1, 0, -5160.71533203125, -882.70489501953125, 507.3590087890625, 1.780235767364501953, 120, 0, 0, 0, 0, 0, "", 51943, 1, NULL), +(240294, 35247, 0, 1, 1, 0, -5161.99658203125, -863.6632080078125, 507.281585693359375, 4.834561824798583984, 120, 0, 0, 0, 0, 0, "", 51943, 1, NULL), +(240295, 35247, 0, 1, 1, 0, -5154.46875, -866.9305419921875, 507.900146484375, 3.420845270156860351, 120, 0, 0, 0, 0, 0, "", 51943, 1, NULL), +(240296, 35247, 0, 1, 1, 0, -5157.59033203125, -864.23089599609375, 507.502685546875, 3.996803998947143554, 120, 0, 0, 0, 0, 0, "", 51943, 1, NULL), +(240297, 35247, 0, 1, 1, 0, -5166.62841796875, -874.4444580078125, 507.21295166015625, 0.837758064270019531, 120, 0, 0, 0, 0, 0, "", 51943, 1, NULL), +(240298, 35248, 0, 1, 1, 0, -5157.13720703125, -875.779541015625, 507.76727294921875, 2.076941728591918945, 120, 0, 0, 0, 0, 0, "", 51943, 1, NULL), +(240299, 35248, 0, 1, 1, 0, -5165.798828125, -866.6875, 506.89959716796875, 5.829399585723876953, 120, 0, 0, 0, 0, 0, "", 51943, 1, NULL), +(240300, 35248, 0, 1, 1, 0, -5153.845703125, -872.18927001953125, 508.302032470703125, 2.775073528289794921, 120, 0, 0, 0, 0, 0, "", 51943, 1, NULL), +(240301, 35248, 0, 1, 1, 0, -5162.43603515625, -877.17706298828125, 507.35357666015625, 1.431169986724853515, 120, 0, 0, 0, 0, 0, "", 51943, 1, NULL), +(240302, 35248, 0, 1, 1, 0, -5167.7275390625, -870.47918701171875, 506.750396728515625, 0.279252678155899047, 120, 0, 0, 0, 0, 0, "", 51943, 1, NULL), +(240339, 35250, 1, 1, 1, 0, 10059.9951171875, 2126.338623046875, 1329.7412109375, 3.769911050796508789, 120, 0, 0, 0, 0, 0, "", 51943, 1, NULL), +(240340, 35250, 1, 1, 1, 0, 10052.1318359375, 2108.732666015625, 1329.73095703125, 1.378810048103332519, 120, 0, 0, 0, 0, 0, "", 51943, 1, NULL); + +-- new spawns +DELETE FROM `creature` WHERE (`id1` IN (35243, 35244, 35246, 35249, 35250, 35251, 35252, 35258, 35259)) AND (`guid` IN (53793, 53794, 53795, 53796, 53797, 53798, 53799, 53800, 53801, 53802, 53803, 53804, 53805, 53806, 53807, 53808, 53809, 53810, 53811, 53812, 53813, 53814, 53815, 53816, 53817, 53818, 53819, 53820, 53821, 53822, 53823, 53824, 53825, 53826, 53827, 53828, 53829, 53830, 53831)); +INSERT INTO `creature` (`guid`, `id1`, `map`, `spawnMask`, `phaseMask`, `equipment_id`, `position_x`, `position_y`, `position_z`, `orientation`, `spawntimesecs`, `wander_distance`, `MovementType`, `npcflag`, `unit_flags`, `dynamicflags`, `ScriptName`, `VerifiedBuild`, `CreateObject`, `Comment`) VALUES +(53793, 35243, 530, 1, 1, 0, 9410.404296875, -6856.34033203125, 14.88649463653564453, 4.049163818359375, 120, 0, 0, 0, 0, 0, "", 51943, 1, NULL), +(53794, 35243, 530, 1, 1, 0, 9411.26953125, -6832.328125, 16.75127601623535156, 3.228859186172485351, 120, 0, 0, 0, 0, 0, "", 51943, 1, NULL), +(53795, 35243, 530, 1, 1, 0, 9417.37890625, -6840.1875, 15.81598854064941406, 2.129301786422729492, 120, 0, 0, 0, 0, 0, "", 51943, 1, NULL), +(53796, 35243, 530, 1, 1, 0, 9417.46875, -6832.5693359375, 16.11979293823242187, 4.084070205688476562, 120, 0, 0, 0, 0, 0, "", 51943, 1, NULL), +(53797, 35243, 530, 1, 1, 0, 9421.55859375, -6836.08349609375, 15.54009628295898437, 3.246312379837036132, 120, 0, 0, 0, 0, 0, "", 51943, 1, NULL), +(53798, 35244, 0, 1, 1, 0, 1776.6875, 227.5694427490234375, 59.8570556640625, 0.05235987901687622, 120, 0, 0, 0, 0, 0, "", 51943, 1, NULL), +(53799, 35244, 0, 1, 1, 0, 1779.7117919921875, 249.8559112548828125, 59.92548370361328125, 1.378810048103332519, 120, 0, 0, 0, 0, 0, "", 51943, 1, NULL), +(53800, 35244, 0, 1, 1, 0, 1780.986083984375, 264.322906494140625, 59.7176513671875, 5.358160972595214843, 120, 0, 0, 0, 0, 0, "", 51943, 1, NULL), +(53801, 35244, 0, 1, 1, 0, 1781.376708984375, 257.161468505859375, 59.58280181884765625, 4.590215682983398437, 120, 0, 0, 0, 0, 0, "", 51943, 1, NULL), +(53802, 35244, 0, 1, 1, 0, 1781.576416015625, 230.75347900390625, 59.88961410522460937, 5.864306449890136718, 120, 0, 0, 0, 0, 0, "", 51943, 1, NULL), +(53803, 35244, 0, 1, 1, 0, 1786.8021240234375, 208.7118072509765625, 59.82406997680664062, 1.169370532035827636, 120, 0, 0, 0, 0, 0, "", 51943, 1, NULL), +(53804, 35244, 0, 1, 1, 0, 1789.220458984375, 213.685760498046875, 59.9723358154296875, 4.188790321350097656, 120, 0, 0, 0, 0, 0, "", 51943, 1, NULL), +(53805, 35244, 0, 1, 1, 0, 1802.546875, 215.5625, 65.95556640625, 1.65806281566619873, 120, 0, 0, 0, 0, 0, "", 51943, 1, NULL), +(53806, 35244, 0, 1, 1, 0, 1808.763916015625, 215.5590362548828125, 65.95556640625, 1.623156189918518066, 120, 0, 0, 0, 0, 0, "", 51943, 1, NULL), +(53807, 35244, 0, 1, 1, 0, 1823.607666015625, 218.8819427490234375, 60.47595977783203125, 1.29154360294342041, 120, 0, 0, 0, 0, 0, "", 51943, 1, NULL), +(53808, 35244, 0, 1, 1, 0, 1825.2725830078125, 257.40972900390625, 59.95352935791015625, 1.93731546401977539, 120, 0, 0, 0, 0, 0, "", 51943, 1, NULL), +(53809, 35244, 0, 1, 1, 0, 1825.670166015625, 249.7916717529296875, 60.12625885009765625, 0.48869219422340393, 120, 0, 0, 0, 0, 0, "", 51943, 1, NULL), +(53810, 35244, 0, 1, 1, 0, 1826.1163330078125, 263.0382080078125, 59.77779006958007812, 3.420845270156860351, 120, 0, 0, 0, 0, 0, "", 51943, 1, NULL), +(53811, 35246, 530, 1, 1, 0, -4329.2119140625, -12448.7431640625, 17.27162742614746093, 0.506145477294921875, 120, 0, 0, 0, 0, 0, "", 51943, 1, NULL), +(53812, 35249, 0, 1, 1, 0, -9350.6982421875, 168.251739501953125, 61.64437484741210937, 1.01229095458984375, 120, 0, 0, 0, 0, 0, "", 51943, 1, NULL), +(53813, 35250, 1, 1, 1, 0, 10061.029296875, 2110.626708984375, 1329.734375, 1.29154360294342041, 120, 0, 0, 0, 0, 0, "", 51943, 1, NULL), +(53814, 35250, 1, 1, 1, 0, 10061.646484375, 2118.564208984375, 1329.7435302734375, 2.967059612274169921, 120, 0, 0, 0, 0, 0, "", 51943, 1, NULL), +(53815, 35250, 1, 1, 1, 0, 10065.287109375, 2103.282958984375, 1330.635498046875, 4.066617012023925781, 120, 0, 0, 0, 0, 0, "", 51943, 1, NULL), +(53816, 35250, 1, 1, 1, 0, 10066.953125, 2123.397705078125, 1329.7412109375, 2.967059612274169921, 120, 0, 0, 0, 0, 0, "", 51943, 1, NULL), +(53817, 35250, 1, 1, 1, 0, 10067.0908203125, 2128.99658203125, 1329.7412109375, 3.630284786224365234, 120, 0, 0, 0, 0, 0, "", 51943, 1, NULL), +(53818, 35250, 1, 1, 1, 0, 10068.2255859375, 2117.38720703125, 1329.76416015625, 1.832595705986022949, 120, 0, 0, 0, 0, 0, "", 51943, 1, NULL), +(53819, 35251, 1, 1, 1, 0, 1185.26220703125, -4465.97412109375, 21.38922119140625, 2.408554315567016601, 120, 0, 0, 0, 0, 0, "", 51943, 1, NULL), +(53820, 35251, 1, 1, 1, 0, 1186.7586669921875, -4462.24853515625, 21.24035835266113281, 1.274090290069580078, 120, 0, 0, 0, 0, 0, "", 51943, 1, NULL), +(53821, 35251, 1, 1, 1, 0, 1192.923583984375, -4467.40966796875, 21.63202285766601562, 3.176499128341674804, 120, 0, 0, 0, 0, 0, "", 51943, 1, NULL), +(53822, 35252, 1, 1, 1, 0, -984.48785400390625, -82.5694427490234375, 21.32398033142089843, 1.29154360294342041, 120, 0, 0, 0, 0, 0, "", 51943, 1, NULL), +(53823, 35252, 1, 1, 1, 0, -986.09375, -79.298614501953125, 21.44527244567871093, 1.134464025497436523, 120, 0, 0, 0, 0, 0, "", 51943, 1, NULL), +(53824, 35252, 1, 1, 1, 0, -988.1961669921875, -76.1545181274414062, 22.06944465637207031, 1.832595705986022949, 120, 0, 0, 0, 0, 0, "", 51943, 1, NULL), +(53825, 35252, 1, 1, 1, 0, -988.50177001953125, -70.1875, 22.69485855102539062, 6.17846536636352539, 120, 0, 0, 0, 0, 0, "", 51943, 1, NULL), +(53826, 35258, 530, 1, 1, 0, -1832.876708984375, 4923.1708984375, -21.4524955749511718, 1.134464025497436523, 120, 0, 0, 0, 0, 0, "", 51943, 1, NULL), +(53827, 35258, 530, 1, 1, 0, -1834.5208740234375, 4926.9765625, -21.4531154632568359, 0.977384388446807861, 120, 0, 0, 0, 0, 0, "", 51943, 1, NULL), +(53828, 35258, 530, 1, 1, 0, -1837.7239990234375, 4927.68505859375, -21.1529521942138671, 1.29154360294342041, 120, 0, 0, 0, 0, 0, "", 51943, 1, NULL), +(53829, 35259, 530, 1, 1, 0, -1803.751708984375, 4906.93994140625, -21.3884010314941406, 2.356194496154785156, 120, 0, 0, 0, 0, 0, "", 51943, 1, NULL), +(53830, 35259, 530, 1, 1, 0, -1812.2760009765625, 4911.76220703125, -21.3407649993896484, 0.907571196556091308, 120, 0, 0, 0, 0, 0, "", 51943, 1, NULL), +(53831, 35259, 530, 1, 1, 0, -1815.9166259765625, 4913.81005859375, -21.4253044128417968, 1.535889744758605957, 120, 0, 0, 0, 0, 0, "", 51943, 1, NULL); + +-- remove duplicate spawns +DELETE FROM `creature` WHERE (`id1` IN (35254)) AND (`guid` IN (240241)); +DELETE FROM `creature_addon` WHERE (`guid` IN (240241)); +DELETE FROM `game_event_creature` WHERE (`eventEntry` = 51) AND (`guid` IN (240241)); + +-- enable all spawns for eventEntry 51 +DELETE FROM `game_event_creature` WHERE (`eventEntry` = 51) AND (`guid` IN (SELECT `guid` FROM `creature` WHERE `id1` IN (34435, 34476, 34477, 34478, 34479, 34480, 34481, 34482, 34483, 34484, 35243, 35244, 35246, 35247, 35248, 35249, 35250, 35251, 35252, 35253, 35254, 35256, 35258, 35259, 35260, 35261))); +INSERT INTO `game_event_creature` (`eventEntry`, `guid`) (SELECT 51, `guid` FROM `creature` WHERE `id1` IN (34435, 34476, 34477, 34478, 34479, 34480, 34481, 34482, 34483, 34484, 35243, 35244, 35246, 35247, 35248, 35249, 35250, 35251, 35252, 35253, 35254, 35256, 35258, 35259, 35260, 35261)); From 12927674f457ee797a0684116e7d6c740d82fe5e Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Fri, 27 Feb 2026 12:34:14 +0000 Subject: [PATCH 138/150] chore(DB): import pending files Referenced commit(s): 9f79d53b6634f28e79ffe427a2e58754be70595a --- .../rev_1771915997105053200.sql => db_world/2026_02_27_01.sql} | 1 + 1 file changed, 1 insertion(+) rename data/sql/updates/{pending_db_world/rev_1771915997105053200.sql => db_world/2026_02_27_01.sql} (99%) diff --git a/data/sql/updates/pending_db_world/rev_1771915997105053200.sql b/data/sql/updates/db_world/2026_02_27_01.sql similarity index 99% rename from data/sql/updates/pending_db_world/rev_1771915997105053200.sql rename to data/sql/updates/db_world/2026_02_27_01.sql index cab89e1ec..bf2a5cfb9 100644 --- a/data/sql/updates/pending_db_world/rev_1771915997105053200.sql +++ b/data/sql/updates/db_world/2026_02_27_01.sql @@ -1,3 +1,4 @@ +-- DB update 2026_02_27_00 -> 2026_02_27_01 -- Update creature 'Day of the Dead Celebrants and Spirits' with sniffed values -- updated spawns DELETE FROM `creature` WHERE (`id1` IN (35250, 34479, 35243, 35249, 35253, 35251, 34483, 34482, 34435, 34477, 35256, 35254, 35244, 34476, 34480, 35252, 34484, 35246, 35260, 35261, 35258, 35259, 34481, 34478, 35247, 35248)) AND (`guid` IN (240194, 240195, 240196, 240197, 240198, 240199, 240200, 240201, 240202, 240203, 240204, 240205, 240206, 240207, 240208, 240209, 240210, 240211, 240212, 240213, 240214, 240215, 240216, 240217, 240218, 240219, 240220, 240221, 240222, 240223, 240224, 240225, 240230, 240231, 240232, 240233, 240234, 240235, 240236, 240237, 240238, 240239, 240240, 240242, 240243, 240244, 240245, 240246, 240247, 240248, 240249, 240250, 240267, 240268, 240269, 240270, 240271, 240272, 240273, 240274, 240275, 240276, 240277, 240278, 240279, 240280, 240281, 240282, 240283, 240284, 240285, 240286, 240287, 240288, 240289, 240290, 240291, 240292, 240293, 240294, 240295, 240296, 240297, 240298, 240299, 240300, 240301, 240302, 240339, 240340)); From 74dd60a7b1964f509eafc1abb815ae1a4ee8e6da Mon Sep 17 00:00:00 2001 From: blinkysc <37940565+blinkysc@users.noreply.github.com> Date: Fri, 27 Feb 2026 08:41:22 -0600 Subject: [PATCH 139/150] fix(Core/Spells): Fix Swift Hand of Justice healing for 0 (#24911) Co-authored-by: blinkysc Co-authored-by: ariel- --- src/server/scripts/Spells/spell_item.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/server/scripts/Spells/spell_item.cpp b/src/server/scripts/Spells/spell_item.cpp index a9a430cf1..6c14b0563 100644 --- a/src/server/scripts/Spells/spell_item.cpp +++ b/src/server/scripts/Spells/spell_item.cpp @@ -5903,7 +5903,10 @@ class spell_item_swift_hand_justice_dummy : public AuraScript void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) { PreventDefaultAction(); - eventInfo.GetActor()->CastSpell(nullptr, SPELL_SWIFT_HAND_OF_JUSTICE_HEAL, true, nullptr, aurEff); + + Unit* caster = eventInfo.GetActor(); + int32 bp0 = static_cast(caster->CountPctFromMaxHealth(aurEff->GetAmount())); + caster->CastCustomSpell(SPELL_SWIFT_HAND_OF_JUSTICE_HEAL, SPELLVALUE_BASE_POINT0, bp0, nullptr, true, nullptr, aurEff); } void Register() override From 396c35be2f5a847a950f45e5f22248c22c7cfeda Mon Sep 17 00:00:00 2001 From: blinkysc <37940565+blinkysc@users.noreply.github.com> Date: Fri, 27 Feb 2026 08:42:17 -0600 Subject: [PATCH 140/150] fix(Core/Spells): Fix Cobra Strikes stack consumption (#24906) Co-authored-by: blinkysc Co-authored-by: TrinityCore --- .../rev_1772186400000000000.sql | 5 ++ src/server/game/Entities/Unit/Unit.cpp | 17 +++++++ src/server/game/Spells/SpellInfo.cpp | 6 +-- .../game/Spells/SpellInfoCorrections.cpp | 7 --- src/server/scripts/Spells/spell_hunter.cpp | 48 ++++++++++++++++++- 5 files changed, 72 insertions(+), 11 deletions(-) create mode 100644 data/sql/updates/pending_db_world/rev_1772186400000000000.sql diff --git a/data/sql/updates/pending_db_world/rev_1772186400000000000.sql b/data/sql/updates/pending_db_world/rev_1772186400000000000.sql new file mode 100644 index 000000000..5445b657a --- /dev/null +++ b/data/sql/updates/pending_db_world/rev_1772186400000000000.sql @@ -0,0 +1,5 @@ +-- Cobra Strikes spell script bindings +DELETE FROM `spell_script_names` WHERE `spell_id` IN (-53256, 53257); +INSERT INTO `spell_script_names` (`spell_id`, `ScriptName`) VALUES +(-53256, 'spell_hun_cobra_strikes'), +(53257, 'spell_hun_cobra_strikes_triggered'); diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index 9f63466b1..56604d76e 100644 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -13040,6 +13040,23 @@ void Unit::TriggerAurasProcOnEvent(std::list* myProcAuras, std AuraApplicationProcContainer myAurasTriggeringProc; GetProcAurasTriggeredOnEvent(myAurasTriggeringProc, myProcAuras, myProcEventInfo); + // needed for example for Cobra Strikes, pet does the attack, but aura is on owner + if (Player* modOwner = GetSpellModOwner()) + { + if (modOwner != this && spell) + { + std::list modAuras; + for (auto itr = modOwner->GetAppliedAuras().begin(); itr != modOwner->GetAppliedAuras().end(); ++itr) + { + if (spell->m_appliedMods.count(itr->second->GetBase()) != 0) + modAuras.push_back(itr->second); + } + + if (!modAuras.empty()) + modOwner->GetProcAurasTriggeredOnEvent(myAurasTriggeringProc, &modAuras, myProcEventInfo); + } + } + // prepare data for target trigger ProcEventInfo targetProcEventInfo = ProcEventInfo(this, actionTarget, this, typeMaskActionTarget, spellTypeMask, spellPhaseMask, hitMask, spell, damageInfo, healInfo); AuraApplicationProcContainer targetAurasTriggeringProc; diff --git a/src/server/game/Spells/SpellInfo.cpp b/src/server/game/Spells/SpellInfo.cpp index 209a54923..978f73d9f 100644 --- a/src/server/game/Spells/SpellInfo.cpp +++ b/src/server/game/Spells/SpellInfo.cpp @@ -1313,10 +1313,10 @@ bool SpellInfo::IsAffectedBySpellMod(SpellModifier const* mod) const if (affectSpell->SpellFamilyName != SpellFamilyName) return false; - if (mod->mask & SpellFamilyFlags) - return true; + if (mod->mask && !(mod->mask & SpellFamilyFlags)) + return false; - return false; + return true; } bool SpellInfo::CanPierceImmuneAura(SpellInfo const* aura) const diff --git a/src/server/game/Spells/SpellInfoCorrections.cpp b/src/server/game/Spells/SpellInfoCorrections.cpp index dc5218fba..8553143a5 100644 --- a/src/server/game/Spells/SpellInfoCorrections.cpp +++ b/src/server/game/Spells/SpellInfoCorrections.cpp @@ -652,13 +652,6 @@ void SpellMgr::LoadSpellInfoCorrections() spellInfo->AttributesEx3 |= SPELL_ATTR3_ALWAYS_HIT; }); - // Cobra Strikes - ApplySpellFix({ 53257 }, [](SpellInfo* spellInfo) - { - spellInfo->ProcCharges = 2; - spellInfo->StackAmount = 0; - }); - // Kill Command // Kill Command, Overpower ApplySpellFix({ 34027, 37529 }, [](SpellInfo* spellInfo) diff --git a/src/server/scripts/Spells/spell_hunter.cpp b/src/server/scripts/Spells/spell_hunter.cpp index 7877a9bd9..fce48f898 100644 --- a/src/server/scripts/Spells/spell_hunter.cpp +++ b/src/server/scripts/Spells/spell_hunter.cpp @@ -78,7 +78,8 @@ enum HunterSpells SPELL_HUNTER_RAPID_RECUPERATION_MANA_R1 = 56654, SPELL_HUNTER_RAPID_RECUPERATION_MANA_R2 = 58882, SPELL_HUNTER_PIERCING_SHOTS = 63468, - SPELL_HUNTER_T9_4P_GREATNESS = 68130 + SPELL_HUNTER_T9_4P_GREATNESS = 68130, + SPELL_HUNTER_COBRA_STRIKES_TRIGGERED = 53257 }; enum HunterSpellIcons @@ -934,6 +935,49 @@ class spell_hun_misdirection_proc : public AuraScript } }; +// -53256 - Cobra Strikes (talent) +class spell_hun_cobra_strikes : public AuraScript +{ + PrepareAuraScript(spell_hun_cobra_strikes); + + bool Validate(SpellInfo const* spellInfo) override + { + return ValidateSpellInfo({ spellInfo->Effects[EFFECT_0].TriggerSpell }); + } + + void HandleProc(AuraEffect const* aurEff, ProcEventInfo& /*eventInfo*/) + { + PreventDefaultAction(); + + SpellInfo const* triggeredSpellInfo = sSpellMgr->GetSpellInfo(aurEff->GetSpellInfo()->Effects[aurEff->GetEffIndex()].TriggerSpell); + if (!triggeredSpellInfo) + return; + + GetTarget()->CastCustomSpell(triggeredSpellInfo->Id, SPELLVALUE_AURA_STACK, triggeredSpellInfo->StackAmount, GetTarget(), true); + } + + void Register() override + { + OnEffectProc += AuraEffectProcFn(spell_hun_cobra_strikes::HandleProc, EFFECT_0, SPELL_AURA_PROC_TRIGGER_SPELL); + } +}; + +// 53257 - Cobra Strikes (triggered buff) +class spell_hun_cobra_strikes_triggered : public AuraScript +{ + PrepareAuraScript(spell_hun_cobra_strikes_triggered); + + void HandleStackDrop(AuraEffect const* /*aurEff*/, ProcEventInfo& /*eventInfo*/) + { + ModStackAmount(-1); + } + + void Register() override + { + OnEffectProc += AuraEffectProcFn(spell_hun_cobra_strikes_triggered::HandleStackDrop, EFFECT_0, SPELL_AURA_ADD_FLAT_MODIFIER); + } +}; + // 781 - Disengage class spell_hun_disengage : public SpellScript { @@ -1633,6 +1677,8 @@ void AddSC_hunter_spell_scripts() RegisterSpellScript(spell_hun_aspect_of_the_beast); RegisterSpellScript(spell_hun_ascpect_of_the_viper); RegisterSpellScript(spell_hun_chimera_shot); + RegisterSpellScript(spell_hun_cobra_strikes); + RegisterSpellScript(spell_hun_cobra_strikes_triggered); RegisterSpellScript(spell_hun_disengage); RegisterSpellScript(spell_hun_improved_mend_pet); RegisterSpellScript(spell_hun_invigoration); From df04120c16a9ac67098d14ba317ff73475388f24 Mon Sep 17 00:00:00 2001 From: blinkysc <37940565+blinkysc@users.noreply.github.com> Date: Fri, 27 Feb 2026 08:42:40 -0600 Subject: [PATCH 141/150] fix(DB/Proc): Add missing NONE DmgClass flags and fix SpellPhaseMask for on-cast procs (#24903) Co-authored-by: blinkysc --- .../rev_1772134223874742153.sql | 50 +++++++++++++++++++ 1 file changed, 50 insertions(+) create mode 100644 data/sql/updates/pending_db_world/rev_1772134223874742153.sql diff --git a/data/sql/updates/pending_db_world/rev_1772134223874742153.sql b/data/sql/updates/pending_db_world/rev_1772134223874742153.sql new file mode 100644 index 000000000..11a2e8965 --- /dev/null +++ b/data/sql/updates/pending_db_world/rev_1772134223874742153.sql @@ -0,0 +1,50 @@ +-- Fix "on cast" procs: add missing NONE DmgClass flags and correct SpellPhaseMask +-- These spells have tooltips like "chance on successful spellcast" but were missing +-- DONE_SPELL_NONE_DMG_CLASS_POS/NEG flags, preventing NONE-DmgClass spells from +-- proccing them. Some also had SpellPhaseMask=2 (HIT) instead of 1 (CAST). + +-- [27521] Mana Restore - "2% chance on successful spellcast to restore mana" +-- Phase HIT->CAST, add NONE flags: 0x14000 -> 0x15400 +UPDATE `spell_proc` SET `ProcFlags` = 0x15400, `SpellPhaseMask` = 1 WHERE `SpellId` = 27521; + +-- [27774] The Furious Storm - "Chance on spell cast to increase your spell power" +-- Phase HIT->CAST, add NONE flags: 0x14000 -> 0x15400 +UPDATE `spell_proc` SET `ProcFlags` = 0x15400, `SpellPhaseMask` = 1 WHERE `SpellId` = 27774; + +-- [32837] Spell Focus Trigger - "Chance on successful spellcast to grant Spell Haste" +-- Phase HIT->CAST, add NONE flags: 0x14000 -> 0x15400 +UPDATE `spell_proc` SET `ProcFlags` = 0x15400, `SpellPhaseMask` = 1 WHERE `SpellId` = 32837; + +-- [32980] Arcane Might - "2% chance on successful spellcast to increase spell power" +-- No spell_proc entry existed. Add with NONE flags and CAST phase. +DELETE FROM `spell_proc` WHERE `SpellId` = 32980; +INSERT INTO `spell_proc` (`SpellId`, `ProcFlags`, `SpellPhaseMask`) VALUES (32980, 0x15400, 1); + +-- [32981] Verdant Flame - "Chance on successful spellcast to restore Mana" +-- No spell_proc entry existed. Add with NONE flags and CAST phase. +DELETE FROM `spell_proc` WHERE `SpellId` = 32981; +INSERT INTO `spell_proc` (`SpellId`, `ProcFlags`, `SpellPhaseMask`) VALUES (32981, 0x15400, 1); + +-- [34584] Love Struck - "Chance on spell cast to increase your Spirit" +-- Phase HIT->CAST, add NONE flags: 0x14000 -> 0x15400 +UPDATE `spell_proc` SET `ProcFlags` = 0x15400, `SpellPhaseMask` = 1 WHERE `SpellId` = 34584; + +-- [38334] Proc Mana Regen - "Your spell casts have a chance to allow mana regen" +-- Phase HIT->CAST, add NONE flags: 0x14000 -> 0x15400 +UPDATE `spell_proc` SET `ProcFlags` = 0x15400, `SpellPhaseMask` = 1 WHERE `SpellId` = 38334; + +-- [55381] Mana Restore - "2% chance on successful spellcast to restore mana" +-- Phase HIT->CAST, add NONE flags: 0x14000 -> 0x15400 +UPDATE `spell_proc` SET `ProcFlags` = 0x15400, `SpellPhaseMask` = 1 WHERE `SpellId` = 55381; + +-- [58442] Airy Pale Ale - "Chance on successful spellcast to restore mana" +-- Phase HIT->CAST, add NONE flags: 0x14000 -> 0x15400 +UPDATE `spell_proc` SET `ProcFlags` = 0x15400, `SpellPhaseMask` = 1 WHERE `SpellId` = 58442; + +-- [62114] Flow of Knowledge - "Your spell casts have a chance to increase spell power" +-- Phase HIT->CAST, add NONE flags: 0x54000 -> 0x55400 +UPDATE `spell_proc` SET `ProcFlags` = 0x55400, `SpellPhaseMask` = 1 WHERE `SpellId` = 62114; + +-- [71585] Item - Icecrown 25 Emblem Healer Trinket - "Your spell casts have a chance to grant mana per 5 sec" +-- Phase already CAST, just add NONE flags: 0x14000 -> 0x15400 +UPDATE `spell_proc` SET `ProcFlags` = 0x15400 WHERE `SpellId` = 71585; From 03b27f47846c5853c0b38e4359de943a76cffadf Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Fri, 27 Feb 2026 14:54:17 +0000 Subject: [PATCH 142/150] chore(DB): import pending files Referenced commit(s): 74dd60a7b1964f509eafc1abb815ae1a4ee8e6da --- .../rev_1772134223874742153.sql => db_world/2026_02_27_02.sql} | 1 + .../rev_1772186400000000000.sql => db_world/2026_02_27_03.sql} | 1 + 2 files changed, 2 insertions(+) rename data/sql/updates/{pending_db_world/rev_1772134223874742153.sql => db_world/2026_02_27_02.sql} (98%) rename data/sql/updates/{pending_db_world/rev_1772186400000000000.sql => db_world/2026_02_27_03.sql} (85%) diff --git a/data/sql/updates/pending_db_world/rev_1772134223874742153.sql b/data/sql/updates/db_world/2026_02_27_02.sql similarity index 98% rename from data/sql/updates/pending_db_world/rev_1772134223874742153.sql rename to data/sql/updates/db_world/2026_02_27_02.sql index 11a2e8965..87c0e1c03 100644 --- a/data/sql/updates/pending_db_world/rev_1772134223874742153.sql +++ b/data/sql/updates/db_world/2026_02_27_02.sql @@ -1,3 +1,4 @@ +-- DB update 2026_02_27_01 -> 2026_02_27_02 -- Fix "on cast" procs: add missing NONE DmgClass flags and correct SpellPhaseMask -- These spells have tooltips like "chance on successful spellcast" but were missing -- DONE_SPELL_NONE_DMG_CLASS_POS/NEG flags, preventing NONE-DmgClass spells from diff --git a/data/sql/updates/pending_db_world/rev_1772186400000000000.sql b/data/sql/updates/db_world/2026_02_27_03.sql similarity index 85% rename from data/sql/updates/pending_db_world/rev_1772186400000000000.sql rename to data/sql/updates/db_world/2026_02_27_03.sql index 5445b657a..0ce64a530 100644 --- a/data/sql/updates/pending_db_world/rev_1772186400000000000.sql +++ b/data/sql/updates/db_world/2026_02_27_03.sql @@ -1,3 +1,4 @@ +-- DB update 2026_02_27_02 -> 2026_02_27_03 -- Cobra Strikes spell script bindings DELETE FROM `spell_script_names` WHERE `spell_id` IN (-53256, 53257); INSERT INTO `spell_script_names` (`spell_id`, `ScriptName`) VALUES From 4c44b03e516a936ba45d667d09651e1c5c543d74 Mon Sep 17 00:00:00 2001 From: sudlud Date: Fri, 27 Feb 2026 18:29:00 +0100 Subject: [PATCH 143/150] fix(DB/Gameobject): Sniffed Values for 'Doodad_OrcBonFire01' spawns (#24919) --- .../sql/updates/pending_db_world/rev_1772202396609034600.sql | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 data/sql/updates/pending_db_world/rev_1772202396609034600.sql diff --git a/data/sql/updates/pending_db_world/rev_1772202396609034600.sql b/data/sql/updates/pending_db_world/rev_1772202396609034600.sql new file mode 100644 index 000000000..1ff48ae84 --- /dev/null +++ b/data/sql/updates/pending_db_world/rev_1772202396609034600.sql @@ -0,0 +1,5 @@ +-- Update gameobject 'Doodad_OrcBonFire01' with sniffed values +-- new spawns +DELETE FROM `gameobject` WHERE (`id` IN (192612)) AND (`guid` IN (50)); +INSERT INTO `gameobject` (`guid`, `id`, `map`, `zoneId`, `areaId`, `spawnMask`, `phaseMask`, `position_x`, `position_y`, `position_z`, `orientation`, `rotation0`, `rotation1`, `rotation2`, `rotation3`, `spawntimesecs`, `animprogress`, `state`, `ScriptName`, `VerifiedBuild`, `Comment`) VALUES +(50, 192612, 530, 0, 0, 1, 1, 7567.4794921875, -7359.6064453125, 161.88848876953125, 3.159062385559082031, 0, 0, -0.99996185302734375, 0.008734640665352344, 120, 255, 1, "", 49822, NULL); From 997d57fd62714999ed15d3ac3b3bdab0b2f118b9 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Fri, 27 Feb 2026 17:30:12 +0000 Subject: [PATCH 144/150] chore(DB): import pending files Referenced commit(s): 4c44b03e516a936ba45d667d09651e1c5c543d74 --- .../rev_1772202396609034600.sql => db_world/2026_02_27_04.sql} | 1 + 1 file changed, 1 insertion(+) rename data/sql/updates/{pending_db_world/rev_1772202396609034600.sql => db_world/2026_02_27_04.sql} (93%) diff --git a/data/sql/updates/pending_db_world/rev_1772202396609034600.sql b/data/sql/updates/db_world/2026_02_27_04.sql similarity index 93% rename from data/sql/updates/pending_db_world/rev_1772202396609034600.sql rename to data/sql/updates/db_world/2026_02_27_04.sql index 1ff48ae84..f57b5dcdb 100644 --- a/data/sql/updates/pending_db_world/rev_1772202396609034600.sql +++ b/data/sql/updates/db_world/2026_02_27_04.sql @@ -1,3 +1,4 @@ +-- DB update 2026_02_27_03 -> 2026_02_27_04 -- Update gameobject 'Doodad_OrcBonFire01' with sniffed values -- new spawns DELETE FROM `gameobject` WHERE (`id` IN (192612)) AND (`guid` IN (50)); From 5273146cb6c1059e201e908cb620d86579fcfc87 Mon Sep 17 00:00:00 2001 From: blinkysc <37940565+blinkysc@users.noreply.github.com> Date: Fri, 27 Feb 2026 11:39:42 -0600 Subject: [PATCH 145/150] fix(Core/Spells): Restrict Beacon of Light proc to intended heals (#24921) Co-authored-by: blinkysc --- .../updates/pending_db_world/rev_1772207125325046.sql | 10 ++++++++++ src/server/scripts/Spells/spell_paladin.cpp | 8 +------- 2 files changed, 11 insertions(+), 7 deletions(-) create mode 100644 data/sql/updates/pending_db_world/rev_1772207125325046.sql diff --git a/data/sql/updates/pending_db_world/rev_1772207125325046.sql b/data/sql/updates/pending_db_world/rev_1772207125325046.sql new file mode 100644 index 000000000..aeb239fc0 --- /dev/null +++ b/data/sql/updates/pending_db_world/rev_1772207125325046.sql @@ -0,0 +1,10 @@ +-- Beacon of Light (53651): restrict proc to Holy Light, Flash of Light, Holy Shock, Lay on Hands +-- Previously had no SpellFamily filter, allowing unintended heals to transfer: +-- Glyph of Holy Light (54968), Seal of Light (20167), JoL (20267) +-- SpellFamilyName=10 (PALADIN) blocks Glyph of Holy Light (GENERIC family) +-- SpellFamilyMask 0xC0008000/0x00010000 allows only: +-- Holy Light (635) Flags[0]=0x80000000 +-- Flash of Light (19750) Flags[0]=0x40000000 +-- Lay on Hands (633) Flags[0]=0x00008000 +-- Holy Shock heal (25914) Flags[1]=0x00010000 +UPDATE `spell_proc` SET `SpellFamilyName` = 10, `SpellFamilyMask0` = 0xC0008000, `SpellFamilyMask1` = 0x00010000 WHERE `SpellId` = 53651; diff --git a/src/server/scripts/Spells/spell_paladin.cpp b/src/server/scripts/Spells/spell_paladin.cpp index a9f8ebfe1..44b210542 100644 --- a/src/server/scripts/Spells/spell_paladin.cpp +++ b/src/server/scripts/Spells/spell_paladin.cpp @@ -2088,18 +2088,12 @@ class spell_pal_light_s_beacon : public AuraScript SPELL_PALADIN_BEACON_OF_LIGHT_AURA, SPELL_PALADIN_BEACON_OF_LIGHT_FLASH, SPELL_PALADIN_BEACON_OF_LIGHT_HOLY, - SPELL_PALADIN_HOLY_LIGHT_R1, - SPELL_PALADIN_JUDGEMENT_OF_LIGHT_HEAL + SPELL_PALADIN_HOLY_LIGHT_R1 }); } bool CheckProc(ProcEventInfo& eventInfo) { - // Don't proc from Judgement of Light heals — JoL sets originalCaster to - // the paladin for combat log, but the heal is actually cast by the attacker. - if (eventInfo.GetSpellInfo() && eventInfo.GetSpellInfo()->Id == SPELL_PALADIN_JUDGEMENT_OF_LIGHT_HEAL) - return false; - // Don't proc if the heal target is the beacon target (no double heal) if (GetTarget()->HasAura(SPELL_PALADIN_BEACON_OF_LIGHT_AURA, eventInfo.GetActor()->GetGUID())) return false; From f5ababeb11a4d0854deb134fc21d11a0b7644dbe Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Fri, 27 Feb 2026 17:41:08 +0000 Subject: [PATCH 146/150] chore(DB): import pending files Referenced commit(s): 5273146cb6c1059e201e908cb620d86579fcfc87 --- .../rev_1772207125325046.sql => db_world/2026_02_27_05.sql} | 1 + 1 file changed, 1 insertion(+) rename data/sql/updates/{pending_db_world/rev_1772207125325046.sql => db_world/2026_02_27_05.sql} (94%) diff --git a/data/sql/updates/pending_db_world/rev_1772207125325046.sql b/data/sql/updates/db_world/2026_02_27_05.sql similarity index 94% rename from data/sql/updates/pending_db_world/rev_1772207125325046.sql rename to data/sql/updates/db_world/2026_02_27_05.sql index aeb239fc0..dc62f9411 100644 --- a/data/sql/updates/pending_db_world/rev_1772207125325046.sql +++ b/data/sql/updates/db_world/2026_02_27_05.sql @@ -1,3 +1,4 @@ +-- DB update 2026_02_27_04 -> 2026_02_27_05 -- Beacon of Light (53651): restrict proc to Holy Light, Flash of Light, Holy Shock, Lay on Hands -- Previously had no SpellFamily filter, allowing unintended heals to transfer: -- Glyph of Holy Light (54968), Seal of Light (20167), JoL (20267) From 34687103091d29b3f032125402bda107788e6c4e Mon Sep 17 00:00:00 2001 From: sudlud Date: Fri, 27 Feb 2026 18:42:11 +0100 Subject: [PATCH 147/150] fix(Core/BF/BG): update Titan Relic spawns with sniffed values (#24912) --- src/server/game/Battlefield/Zones/BattlefieldWG.cpp | 2 +- src/server/game/Battlegrounds/Zones/BattlegroundSA.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/server/game/Battlefield/Zones/BattlefieldWG.cpp b/src/server/game/Battlefield/Zones/BattlefieldWG.cpp index 6f61e1fa7..64ddbecf1 100644 --- a/src/server/game/Battlefield/Zones/BattlefieldWG.cpp +++ b/src/server/game/Battlefield/Zones/BattlefieldWG.cpp @@ -224,7 +224,7 @@ bool BattlefieldWG::Update(uint32 diff) void BattlefieldWG::OnBattleStart() { // Spawn titan relic - GameObject* go = SpawnGameObject(GO_WINTERGRASP_TITAN_S_RELIC, 5440.0f, 2840.8f, 430.43f, 0); + GameObject* go = SpawnGameObject(GO_WINTERGRASP_TITAN_S_RELIC, 5440.37890625f, 2840.493408203125f, 430.2816162109375, 4.45059061050415039f); // VerifiedBuild 51943 if (go) { // Update faction of relic, only attacker can click on diff --git a/src/server/game/Battlegrounds/Zones/BattlegroundSA.h b/src/server/game/Battlegrounds/Zones/BattlegroundSA.h index 97c101497..273bd5f82 100644 --- a/src/server/game/Battlegrounds/Zones/BattlegroundSA.h +++ b/src/server/game/Battlegrounds/Zones/BattlegroundSA.h @@ -195,7 +195,7 @@ float const BG_SA_ObjSpawnlocs[BG_SA_MAXOBJ][4] = { 1227.667f, -212.555f, 55.372f, 0.5023f }, { 1214.681f, 81.21f, 53.413f, 5.745f }, { 878.555f, -108.2f, 117.845f, 0.0f }, - { 836.5f, -108.8f, 120.219f, 0.0f }, + { 837.0653076171875f, -107.536727905273437f, 127.0248489379882812f, 4.468043327331542968f }, // VerifiedBuild 46158 // Ships { 2679.696777f, -826.891235f, 3.712860f, 5.78367f}, //rot2 1 rot3 0.0002f { 2574.003662f, 981.261475f, 2.603424f, 0.807696f}, From 2b28b1268304791b8c6bce8e1920777a4b42851e Mon Sep 17 00:00:00 2001 From: sudlud Date: Fri, 27 Feb 2026 18:42:43 +0100 Subject: [PATCH 148/150] fix(DB/Gameobject): Sniffed Values for 'unnamed yellow dome' spawns (#24894) --- .../updates/pending_db_world/rev_1772110383846082100.sql | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 data/sql/updates/pending_db_world/rev_1772110383846082100.sql diff --git a/data/sql/updates/pending_db_world/rev_1772110383846082100.sql b/data/sql/updates/pending_db_world/rev_1772110383846082100.sql new file mode 100644 index 000000000..81a574744 --- /dev/null +++ b/data/sql/updates/pending_db_world/rev_1772110383846082100.sql @@ -0,0 +1,6 @@ +-- Update gameobject 'unnamed yellow dome' with sniffed values +-- updated spawns +DELETE FROM `gameobject` WHERE (`id` IN (193796, 193795)) AND (`guid` IN (268695, 268770)); +INSERT INTO `gameobject` (`guid`, `id`, `map`, `zoneId`, `areaId`, `spawnMask`, `phaseMask`, `position_x`, `position_y`, `position_z`, `orientation`, `rotation0`, `rotation1`, `rotation2`, `rotation3`, `spawntimesecs`, `animprogress`, `state`, `ScriptName`, `VerifiedBuild`, `Comment`) VALUES +(268695, 193796, 571, 0, 0, 1, 1, 7628.9599609375, 2060.48779296875, 586.426513671875, 3.703464746475219726, 0, 0, -0.96079635620117187, 0.277255088090896606, 120, 255, 1, "", 45942, NULL), +(268770, 193795, 571, 0, 0, 1, 1, 7888.88037109375, 2058.36279296875, 586.39581298828125, 3.729639530181884765, 0, 0, -0.95708560943603515, 0.289805322885513305, 120, 255, 1, "", 45942, NULL); From 8f57a130726ff1311a394be889cdbcf5305617d0 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Fri, 27 Feb 2026 17:43:30 +0000 Subject: [PATCH 149/150] chore(DB): import pending files Referenced commit(s): f5ababeb11a4d0854deb134fc21d11a0b7644dbe --- .../rev_1772110383846082100.sql => db_world/2026_02_27_06.sql} | 1 + 1 file changed, 1 insertion(+) rename data/sql/updates/{pending_db_world/rev_1772110383846082100.sql => db_world/2026_02_27_06.sql} (95%) diff --git a/data/sql/updates/pending_db_world/rev_1772110383846082100.sql b/data/sql/updates/db_world/2026_02_27_06.sql similarity index 95% rename from data/sql/updates/pending_db_world/rev_1772110383846082100.sql rename to data/sql/updates/db_world/2026_02_27_06.sql index 81a574744..5fefd2dad 100644 --- a/data/sql/updates/pending_db_world/rev_1772110383846082100.sql +++ b/data/sql/updates/db_world/2026_02_27_06.sql @@ -1,3 +1,4 @@ +-- DB update 2026_02_27_05 -> 2026_02_27_06 -- Update gameobject 'unnamed yellow dome' with sniffed values -- updated spawns DELETE FROM `gameobject` WHERE (`id` IN (193796, 193795)) AND (`guid` IN (268695, 268770)); From 9ecaf5aca5360902f6c8e0266f547af66426f35c Mon Sep 17 00:00:00 2001 From: blinkysc <37940565+blinkysc@users.noreply.github.com> Date: Fri, 27 Feb 2026 14:02:50 -0600 Subject: [PATCH 150/150] fix(Core/Spells): Remove range check on split damage auras (#24899) Co-authored-by: blinkysc --- src/server/game/Entities/Unit/Unit.cpp | 13 ------------- 1 file changed, 13 deletions(-) diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index 56604d76e..9efc4fa62 100644 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -2495,13 +2495,6 @@ void Unit::CalcAbsorbResist(DamageInfo& dmgInfo, bool Splited) if (!caster || (caster == victim) || !caster->IsInWorld() || !caster->IsAlive()) continue; - // Limit effect range to spell's cast range. (Only for single target auras, AreaAuras don't need it) - // Ignore LOS attribute is only used for the cast portion of the spell - SpellInfo const* splitSpellInfo = (*itr)->GetSpellInfo(); - if (!splitSpellInfo->Effects[(*itr)->GetEffIndex()].IsAreaAuraEffect()) - if (!caster->IsWithinDist(victim, splitSpellInfo->GetMaxRange(splitSpellInfo->IsPositive(), caster))) - continue; - int32 splitDamage = (*itr)->GetAmount(); // absorb must be smaller than the damage itself @@ -2567,13 +2560,7 @@ void Unit::CalcAbsorbResist(DamageInfo& dmgInfo, bool Splited) if (!caster || (caster == victim) || !caster->IsInWorld() || !caster->IsAlive()) continue; - // Limit effect range to spell's cast range. (Only for single target auras, AreaAuras don't need it) - // Ignore LOS attribute is only used for the cast portion of the spell SpellInfo const* splitSpellInfo = (*itr)->GetSpellInfo(); - if (!splitSpellInfo->Effects[(*itr)->GetEffIndex()].IsAreaAuraEffect()) - if (!caster->IsWithinDist(victim, splitSpellInfo->GetMaxRange(splitSpellInfo->IsPositive(), caster))) - continue; - uint32 splitDamage = CalculatePct(dmgInfo.GetDamage(), (*itr)->GetAmount()); SpellSchoolMask splitSchoolMask = schoolMask;