da17074a63
Lets the Paragon class buy Runeforging from the Character Advancement
panel and apply rune enchants from anywhere in the world without needing
to be near a runeforge GameObject. Three carve-outs work together:
* Spell.cpp: bypass the SpellFocusObject GO proximity check when the
caster is a Paragon and the spell belongs to SKILL_RUNEFORGING (776).
Stock DK behaviour is unchanged -- the bypass is gated on
getClass() == CLASS_PARAGON, not on the IsClass() context hook.
* Player.cpp: skip the Paragon class-skill cascade block for skill 776
so the rune-enchant SLA cascade actually fires. Without this the
player gets the Runeforging skill but no rune options at the anvil.
* Paragon_Essence.cpp:
- Treat SKILL_RUNEFORGING children as a meta-skill cluster: cascade
them like passives even though they're active casts, so they stick
as panel_spell_children and get cleaned up via the standard refund
path.
- Whitelist the 8 basic rune-enchants in PruneSkillLineCascadeChildren
so they don't get evicted as "active in children = legacy garbage".
- Force-attach them in PanelLearnSpellChain (the SLA rows ship with
AcquireMethod=0, so the engine cascade alone won't grant them).
- Add an OnPlayerLogin fixup so existing Paragons who bought
Runeforging before this change get the 8 runes retro-granted.
- Stop filtering SPELL_ATTR0_DO_NOT_DISPLAY in PushSpellSnapshot --
Runeforging itself is hidden in the DBC but is a real panel
purchase that must show in the Overview tab.
The two advanced runes (Stoneskin Gargoyle, Nerubian Carapace) are
intentionally excluded from the auto-grant -- retail gates them behind
heroic dungeon / raid item drops and the SLA AcquireMethod=0 honours
that gating.
No SQL migration needed; works against existing DBC + SLA data.
Co-authored-by: Cursor <cursoragent@cursor.com>