* Weapon-narrow: replace blanket EquippedItemSubClassMask bypass with an
explicit allowlist (IsParagonWeaponSubclassWildcardSpell, currently
Maelstrom Weapon 51528 only). Applied at all three gates: Player::
HasItemFitToSpellRequirements, Player::CheckAttackFitToAuraRequirement,
and Aura::IsProcTriggeredOnEvent. Maelstrom Weapon still procs from any
weapon for Paragon, but Hack and Slash / Sword / Mace Specialization
remain correctly weapon-gated.
* Talent ability-rank cascade: TeachLevelGatedAbilityChainNoPanel +
CascadeRanksForTalentLearnSpellEffects walk the SPELL_EFFECT_LEARN_SPELL
chain a talent rank grants and learn each rank up to the player's level.
Wired into HandleCommit (on talent purchase) and OnPlayerLevelChanged
(on level-up). Fixes Mangle (and any future LEARN_SPELL talent) being
stuck at rank 1 because Player::learnSkillRewardedSpells is intentionally
disabled for Paragon's class skill lines.
* Riding-skill gate for flight forms (IsParagonSpellAllowedByRidingSkill):
Flight Form (33943) requires Expert Riding (34090); Swift Flight Form
(40120) requires Artisan Riding (34091). Applied in PanelLearnSpellChain
and TeachLevelGatedAbilityChainNoPanel so the cascade can't push past a
rank the player isn't trained for. Also backticks `rank` in the level-up
query (MySQL reserved word).
* Savage Defense (62600) on the panel: the SpellData bake's blanket
SPELL_ATTR0_PASSIVE filter dropped Savage Defense even though Druid
trainer 33 sells it at level 40. Bake (in fractured-tooling) now carves
out a small PASSIVE_TRAINER_ALLOWLIST and the regenerated
paragon_spell_ae_cost.sql + 2026_05_11_05.sql migration surface it on
the Druid Feral spell tab.
Co-authored-by: Cursor <cursoragent@cursor.com>
The skill-line cascade in Player::learnSkillRewardedSpells re-fires from
_LoadSkills (every login), UpdateSkillsForLevel (every level-up),
UpdateSkillPro (every weapon-skill tick on a training dummy), and
SetSkill (first time a class skill is granted). Each pass re-grants
every SkillLineAbility-tagged class ability on the matching skill line,
which leaks Blood Presence / Death Coil / Death Grip / etc. back into
the spellbook within seconds even after the player intentionally
refunded them via the Character Advancement panel.
Path B fix: a 5-line guard at the top of learnSkillRewardedSpells skips
the cascade for class-category skill lines on CLASS_PARAGON characters.
mod-paragon already calls Player::learnSpell directly for the abilities
the player actually purchased (and their attached passives), so the
panel becomes the sole authority over class abilities. Profession,
weapon, language, and racial cascades stay enabled so recipe auto-learn,
weapon proficiencies, and racial perks still work.
Side effect: passives that previously rode along on the cascade
(Forceful Deflection on Blood Strike, Runic Focus on Icy Touch) must be
force-attached the same way Blood Plague / Frost Fever already are.
Extend kAttached and kFixup in Paragon_Essence.cpp to do that; existing
characters self-heal on next login.
Backfill paragon_spell_ae_cost for 42 spells newly exposed by the panel
after the ClassMask=0 filter was removed from the client catalog
generator (Lava Burst, Hex, Evocation, Kill Shot, Path of Frost,
Horn of Winter, Rune Strike, Raise Ally, Dark Command, etc.). Migration
is INSERT IGNORE so any per-spell tuning on existing rows is preserved.
Co-authored-by: Cursor <cursoragent@cursor.com>
AzerothCore's DBUpdater scans modules/<mod>/data/sql/db-{world,characters,auth}/
(see src/server/database/Updater/UpdateFetcher.cpp). The previous
modules/mod-paragon/sql/{world,characters}/base/ layout was non-standard
and skipped by the updater, so a fresh deploy never had Paragon tables
created automatically.
Move all five SQL files into the standard layout. Files are idempotent
(CREATE TABLE IF NOT EXISTS plus a DELETE+INSERT for the cost table)
and now apply on every dbimport / worldserver start, recorded by hash
in <db>.updates so re-runs are skipped.
Update BUILD-NATIVE.md to drop the manual mysql import section, and
document the SQL layout in the mod-paragon README.
Co-authored-by: Cursor <cursoragent@cursor.com>