Paragon: ship class-12 SkillLineAbility overlay so proficiency passives auto-learn

Companion to 2026_05_09_00.sql (DBC overlay for chrclasses + srci) and
2026_05_10_01.sql (proficiency skill rows in playercreateinfo_skills).
Those two grant the SKILL (Maces, Shield, Cloth, ...) to Paragon at
character creation; this one opens the SkillLineAbility rows that
CASCADE skill -> passive spell, so when a fresh Paragon is created
AC's `Player::LearnDefaultSkill` actually grants the proficiency
passives:

  Block (107), Parry (3127), Dual Wield (674), Defense, weapon Shoot,
  racial Mace/Sword Specialization, ...

Without this overlay, a class-12 Paragon spawns with the right skill
rows but a near-empty spellbook past the racials and class defaults
that come from playercreateinfo_action.

How it works
------------
AC's DBCStores.cpp::LoadDBC loads each store from the on-disk .dbc
file first, then merges <table>_dbc world-DB rows on top. Our patched
client SkillLineAbility.dbc (in patch-enUS-4.MPQ) OR's the class-12
bit (0x800) into ClassMask on 3,314 rows -- the same rows the server
needs for the cascade to fire on Paragon. Stock Docker installs use
the upstream `ac-wotlk-client-data` image which fills data/dbc/ from
a vanilla 3.3.5a extract, so without this SQL overlay the server
runs against an unmodified SkillLineAbility.dbc and the cascade
never fires.

Generation
----------
Auto-generated end-to-end by
`fractured-tooling/from-workspace-root/_gen_paragon_dbc_overlay_sql.py`,
extended in this commit to handle SkillLineAbility.dbc (14-int
WotLK layout, 56 bytes per record). The script diffs patched vs
stock by ID, keeps only rows whose stock ClassMask did NOT include
the class-12 bit but whose patched ClassMask does, and emits the
3,314 REPLACE INTO rows. Re-running with the same inputs is byte-
stable.

Verified locally
----------------
- Migration applies twice in a row at exactly 3,314 SQL overlay rows
  (idempotent: DELETE WHERE ID IN (...) before INSERT).
- ac-worldserver restart logs:
    >> Loaded 10219 SkillLineAbility MultiMap Data
  -- the same total as stock (10,219 rows), confirming our overlay
  REPLACES existing rows by ID rather than appending duplicates.
- Spot-checked spell IDs: 107 (Block, ClassMask 2115 = warrior +
  paladin + dk + Paragon), 3127 (Parry, 2063), 674 (Dual Wield,
  2157), 75 (Auto Shoot, 2052) all carry the 0x800 bit.

Existing characters
-------------------
The cascade fires inside Player::Create and Player::LearnDefaultSkill
at character spawn, so existing class-12 characters created before
this migration keep their broken state. Delete and re-roll, or hand-
grant the missing spells via .learn for individual existing chars.

CLIENT-PATCHES.md updated to add the third symptom ("proficiency
skills exist but passive spells don't auto-learn") and document
this migration as the fourth piece of the class-12 bootstrap.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
Docker Build
2026-05-09 14:38:55 -04:00
parent 2874119c6d
commit 8363b1b6c8
2 changed files with 3372 additions and 11 deletions
+27 -11
View File
@@ -56,13 +56,14 @@ If the **client** shows the Paragon class on the create screen but the
server replies **Character Creation Failed** (sometimes shown as server replies **Character Creation Failed** (sometimes shown as
"Error creating character") when you pick it -- **or** the character "Error creating character") when you pick it -- **or** the character
is created but spawns with no weapon / armor proficiencies (auto-attack is created but spawns with no weapon / armor proficiencies (auto-attack
greys out, can't equip anything beyond a fist) -- the worldserver is greys out, can't equip anything beyond a fist), or with the proficiency
missing one of three pieces of class-12 data. All ship as SQL **skills** but no **passive spells** like Block, Parry, Dual Wield --
migrations under `modules/mod-paragon/data/sql/db-world/updates/` the worldserver is missing one of four pieces of class-12 data. All
and are auto-applied by AzerothCore's DBUpdater on every ship as SQL migrations under
`ac-db-import` run, but the SQL files are baked into the dbimport `modules/mod-paragon/data/sql/db-world/updates/` and are auto-applied
Docker image at build time -- so a stale image won't pick up new by AzerothCore's DBUpdater on every `ac-db-import` run, but the SQL
migrations. Fix: files are baked into the dbimport Docker image at build time -- so a
stale image won't pick up new migrations. Fix:
```bash ```bash
git pull origin main git pull origin main
@@ -71,7 +72,12 @@ docker compose up -d ac-db-import
docker compose restart ac-worldserver docker compose restart ac-worldserver
``` ```
The three migrations: Existing class-12 characters created before these migrations will
keep their broken state -- the cascade only fires inside
`Player::Create` and `Player::LearnDefaultSkill` at character spawn.
Delete the old Paragon and re-roll after the rebuild.
The four migrations:
- `2026_05_09_00.sql` -- DBC overlay rows for `chrclasses_dbc` and - `2026_05_09_00.sql` -- DBC overlay rows for `chrclasses_dbc` and
`skillraceclassinfo_dbc`. Without this the server can't even `skillraceclassinfo_dbc`. Without this the server can't even
@@ -88,12 +94,22 @@ The three migrations:
armor proficiency at level 1. Without this a Paragon spawns with armor proficiency at level 1. Without this a Paragon spawns with
only the universal `classMask = 0` skills (Defense, Unarmed, only the universal `classMask = 0` skills (Defense, Unarmed,
Cloth, languages, Mounts) -- no Swords, no Mail, no Shield, etc. Cloth, languages, Mounts) -- no Swords, no Mail, no Shield, etc.
- `2026_05_10_02.sql` -- 3,314 `skilllineability_dbc` rows opening
the class-12 bit on every SkillLineAbility row our patched
`SkillLineAbility.dbc` modified. AC reads these rows in
`Player::LearnDefaultSkill` to drive the `skill -> passive spell`
cascade. Without it the proficiency *skills* from `_01.sql` exist
but the *passive spells* (Block, Parry, Dual Wield, Defense,
weapon Shoot, racial Mace/Sword Specialization, etc.) never auto-
learn, so the spellbook past the racials looks empty.
After the rebuild + restart, `ac-worldserver` should log After the rebuild + restart, `ac-worldserver` should log
`>> Loaded 72 Player Create Definitions` (was 62 pre-Paragon), `>> Loaded 72 Player Create Definitions` (was 62 pre-Paragon),
`>> Loaded 1391 Player Create Skills` (was 1371), and character `>> Loaded 1391 Player Create Skills` (was 1371),
creation succeeds for any DK-eligible race with a full weapon / `>> Loaded 10219 SkillLineAbility MultiMap Data` (unchanged total --
armor kit. the SQL overlay replaces existing rows by ID, doesn't add new ones),
and character creation succeeds for any DK-eligible race with a full
weapon / armor kit and the matching passive spells.
If the client **logs in** successfully but **disconnects immediately** If the client **logs in** successfully but **disconnects immediately**
when entering the realm: the auth server is handing your client the when entering the realm: the auth server is handing your client the
File diff suppressed because one or more lines are too long