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:
@@ -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
Reference in New Issue
Block a user