Paragon: narrow weapon bypass; cascade talent ranks; Savage Defense
* 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>
This commit is contained in:
@@ -2287,6 +2287,19 @@ private:
|
||||
// beyond what they already include via Unit.h's transitive headers.
|
||||
[[nodiscard]] bool ParagonFamilyMatches(Unit const* listener, uint32 expectedFamily, uint32 actualFamily);
|
||||
|
||||
// Fractured / Paragon: returns true iff `spellId` is on the curated allowlist
|
||||
// of cross-class proc talents whose `EquippedItemSubClassMask` should be
|
||||
// bypassed for Paragon casters (e.g. Maelstrom Weapon ranks 51528-51532).
|
||||
// Used by `Player::HasItemFitToSpellRequirements`,
|
||||
// `Player::CheckAttackFitToAuraRequirement`, and
|
||||
// `Aura::IsProcTriggeredOnEvent` to let these specific talents fire from
|
||||
// any equipped weapon while keeping weapon-specialization talents
|
||||
// (Sword Specialization, Mace Specialization, Hack and Slash, Two-Handed
|
||||
// Weapon Specialization, etc.) gated by their stock weapon-class mask.
|
||||
// The allowlist is matched against `SpellInfo::GetFirstRankSpell()`'s id
|
||||
// so all ranks of a talent are covered by listing the rank-1 id.
|
||||
[[nodiscard]] bool IsParagonWeaponSubclassWildcardSpell(uint32 spellId);
|
||||
|
||||
namespace Acore
|
||||
{
|
||||
// Binary predicate for sorting Units based on percent value of a power
|
||||
|
||||
Reference in New Issue
Block a user