diff --git a/modules/mod-paragon/data/sql/db-world/updates/2026_05_10_03.sql b/modules/mod-paragon/data/sql/db-world/updates/2026_05_10_03.sql new file mode 100644 index 0000000..73e71d7 --- /dev/null +++ b/modules/mod-paragon/data/sql/db-world/updates/2026_05_10_03.sql @@ -0,0 +1,13 @@ +-- mod-paragon: Blood Elf "Arcane Torrent" uses three spell IDs in WotLK +-- (28730 mana/casters, 25046 rogue energy, 50613 death knight runic power), +-- all on racial skill line 756. Migration 2026_05_10_02 OR'd class 12 into +-- every SkillLineAbility delta from patch-enUS-4, so Paragon Blood Elves +-- auto-learned all three and the spellbook showed three identical entries. +-- +-- Paragon uses mana as its primary display power; keep only the mana +-- variant (28730) for class 12. IDs 13338 / 17510 match stock WotLK +-- SkillLineAbility rows for 25046 / 50613 on skill line 756. + +UPDATE `skilllineability_dbc` +SET `ClassMask` = `ClassMask` & ~2048 +WHERE `ID` IN (13338, 17510); diff --git a/modules/mod-paragon/src/Paragon_Essence.cpp b/modules/mod-paragon/src/Paragon_Essence.cpp index dc5ac41..5a208a1 100644 --- a/modules/mod-paragon/src/Paragon_Essence.cpp +++ b/modules/mod-paragon/src/Paragon_Essence.cpp @@ -559,6 +559,23 @@ void RevokeUnwantedCascadeSpellsForPlayer(Player* pl) toRevoke.size(), pl->GetName(), ourSkillLines.size(), allowed.size()); } +// Blood Elf racial "Arcane Torrent" is three different spell IDs in WotLK +// (28730 mana, 25046 rogue energy, 50613 DK runic power), all on skill line +// 756. The blanket SkillLineAbility overlay opened all three to class 12; +// Paragon should keep only the mana version (matches primary power display). +void RevokeDuplicateBloodElfArcaneTorrent(Player* pl) +{ + if (!pl || pl->getRace() != RACE_BLOODELF) + return; + + constexpr uint32 SPELL_ARCANE_TORRENT_ROGUE = 25046; + constexpr uint32 SPELL_ARCANE_TORRENT_DK = 50613; + + for (uint32 sid : { SPELL_ARCANE_TORRENT_ROGUE, SPELL_ARCANE_TORRENT_DK }) + if (pl->HasSpell(sid)) + pl->removeSpell(sid, SPEC_MASK_ALL, false); +} + // Snapshot of currently-known spell IDs (excluding entries marked removed). // Used by PanelLearnSpellChain to detect spells that AzerothCore's // addSpell machinery auto-learns alongside the spell we asked for. @@ -1441,6 +1458,9 @@ public: // cascade re-fire on relog. Only walks our own SkillLines, so // racials / weapon skills / Defense rewards are never touched. RevokeUnwantedCascadeSpellsForPlayer(player); + // Step 3: Blood Elf only -- strip rogue/DK Arcane Torrent clones + // (skill-line overlay taught all three; see 2026_05_10_03.sql). + RevokeDuplicateBloodElfArcaneTorrent(player); // Intentionally NOT calling SendSilenceClose here -- the chat // frame buffers system messages during the loading screen and