From 5deb9e32550907270afda1f03d340699f675545c Mon Sep 17 00:00:00 2001 From: Docker Build Date: Sat, 9 May 2026 13:06:39 -0400 Subject: [PATCH] Paragon: ship class-12 starter spawn data so character creation works on fresh installs Companion to 2026_05_09_00.sql (DBC overlay). The DBC overlay teaches the world server that class 12 (Paragon) exists; this migration teaches it WHERE class-12 characters spawn, what action bar they boot with, and what per-level base stats Player::InitStatsForLevel uses. Without these rows, contributors hit: - Player::Create -> "invalid race/class pair (R/12) - refusing" and the client shows "Error creating character". - WorldServer load -> "class-12 Level-L does not have stats data!" integrity warnings. Tables touched (idempotent: DELETE WHERE class=12 then INSERT): - playercreateinfo : 10 rows, every DK-eligible race spawning in their racial newbie zone (Northshire, Valley of Trials, Ammen Vale, ...). NOT Acherus -- Paragon is from-level-1. - playercreateinfo_action : 46 rows, default action bar layout per race (attack 6603, eat 78, racial, etc.). - player_class_stats : 80 rows, per-level base HP/Mana/STR/AGI/ STA/INT/SPI. Curve mirrors Warrior to level 60, Paladin-style HP inflation past 60 to keep Paragon competitive in Wrath content. Tables intentionally untouched: playercreateinfo_item is empty for class 12 (Paragon ships no per-class starting items, only racial kit), and the mask-based playercreateinfo_skills/_cast_spell/ _spell_custom rows already cover class 12 via their classMask=0 "all classes" entries. Verified locally: applies cleanly twice in a row (idempotent), worldserver restart now logs `>> Loaded 72 Player Create Definitions` (was 62 pre-Paragon = +10 races for class 12) and creates a Draenei Paragon without rejection. CLIENT-PATCHES.md troubleshooting block updated to merge the two "Character Creation Failed" modes (DBC overlay missing + spawn data missing) into a single fix recipe. Existing contributors with a pre-built dbimport image need `docker compose build ac-db-import ac-worldserver` before this migration is visible to DBUpdater; fresh clones get it on first `docker compose up`. Co-authored-by: Cursor --- .../fractured-dev-extras/CLIENT-PATCHES.md | 39 +++- .../sql/db-world/updates/2026_05_10_00.sql | 179 ++++++++++++++++++ 2 files changed, 211 insertions(+), 7 deletions(-) create mode 100644 modules/mod-paragon/data/sql/db-world/updates/2026_05_10_00.sql diff --git a/contrib/fractured-dev-extras/CLIENT-PATCHES.md b/contrib/fractured-dev-extras/CLIENT-PATCHES.md index a371ca8..87572f9 100644 --- a/contrib/fractured-dev-extras/CLIENT-PATCHES.md +++ b/contrib/fractured-dev-extras/CLIENT-PATCHES.md @@ -53,13 +53,38 @@ worldserver image is older than commit `4d2a80d` (the the same release tag and rebuild the worldserver image. If the **client** shows the Paragon class on the create screen but the -server replies **Character Creation Failed** when you pick it on a -**very old** server checkout (predating commit landing -`modules/mod-paragon/data/sql/db-world/updates/2026_05_09_00.sql`): -pull `main` and run `docker compose up -d ac-db-import`. Recent -Fractured server builds ship the Paragon DBC overlay as a SQL -migration (see **Server-side Paragon DBC overlay** below); fresh -checkouts do **not** need the patched DBCs copied into `data/dbc/`. +server replies **Character Creation Failed** (sometimes shown as +"Error creating character") when you pick it: the worldserver is +missing one of two pieces of class-12 spawn data. Both ship as SQL +migrations under `modules/mod-paragon/data/sql/db-world/updates/` +and are auto-applied by AzerothCore's DBUpdater on every +`ac-db-import` run, but the SQL files are baked into the dbimport +Docker image at build time -- so a stale image won't pick up new +migrations. Fix: + +```bash +git pull origin main +docker compose build ac-db-import ac-worldserver +docker compose up -d ac-db-import +docker compose restart ac-worldserver +``` + +The two migrations: + +- `2026_05_09_00.sql` -- DBC overlay rows for `chrclasses_dbc` and + `skillraceclassinfo_dbc`. Without this the server can't even + resolve class 12 in `sChrClassesStore`. See **Server-side Paragon + DBC overlay** below. +- `2026_05_10_00.sql` -- `playercreateinfo`, `playercreateinfo_action`, + and `player_class_stats` rows for class 12. Without this + `Player::Create` rejects every (race, class=12) pair as an + "invalid race/class pair" and the worldserver prints + `class-N Level-L does not have stats data!` integrity warnings on + load. + +After the rebuild + restart, `ac-worldserver` should log +`>> Loaded 72 Player Create Definitions` (was 62 pre-Paragon) and +character creation succeeds for any DK-eligible race. If the client **logs in** successfully but **disconnects immediately** when entering the realm: the auth server is handing your client the diff --git a/modules/mod-paragon/data/sql/db-world/updates/2026_05_10_00.sql b/modules/mod-paragon/data/sql/db-world/updates/2026_05_10_00.sql new file mode 100644 index 0000000..1b6cfd4 --- /dev/null +++ b/modules/mod-paragon/data/sql/db-world/updates/2026_05_10_00.sql @@ -0,0 +1,179 @@ +-- mod-paragon: starter spawn data for class 12 (Paragon). +-- +-- Companion to 2026_05_09_00.sql. The DBC overlay teaches the world +-- server that class 12 exists; this migration teaches it WHERE +-- characters of that class spawn, what action bar they boot with, +-- and what per-level base stats to integrity-check against. +-- +-- Without these rows, character creation fails inside Player::Create: +-- +-- PlayerInfo const* info = sObjectMgr->GetPlayerInfo(race, class); +-- if (!info) { +-- LOG_ERROR("entities.player", +-- "Player::Create: ... invalid race/class pair ({}/{})" +-- " - refusing to do so.", ..., race, class); +-- return false; // -> client sees "Error creating character" +-- } +-- +-- and on world load the player_class_stats integrity check trips: +-- +-- "Class N Level L does not have stats data!" +-- +-- Tables touched: +-- - playercreateinfo : (race, class=12) -> map/zone/x/y/z +-- Race-specific starting zones (Paragon +-- spawns in each race's standard newbie +-- area, NOT Acherus, since it is a +-- from-level-1 class). +-- - playercreateinfo_action : (race, class=12, button) -> action,type +-- Default action bar layout per race. +-- - player_class_stats : (class=12, level 1..80) -> base stats +-- Per-level HP/Mana/STR/AGI/STA/INT/SPI +-- used by Player::InitStatsForLevel. +-- +-- Tables intentionally NOT touched here: +-- - playercreateinfo_item : Paragon ships no per-class starting +-- items; gear comes from the racial +-- kit only. +-- - playercreateinfo_skills / _cast_spell / _spell_custom : +-- These are mask-based. Class-12 baseline +-- weapon/defense skills come through +-- classMask=0 ("all classes") rows that +-- already cover Paragon. The DBC overlay +-- in 2026_05_09_00.sql opens +-- SkillRaceClassInfo for class 12. + +-- Idempotent: blow away any pre-existing class-12 rows first so this +-- migration can be replayed cleanly on a partially-seeded DB (e.g. +-- after a contributor manually patched their local DB before this +-- migration landed). +DELETE FROM `playercreateinfo` WHERE `class` = 12; +DELETE FROM `playercreateinfo_action` WHERE `class` = 12; +DELETE FROM `player_class_stats` WHERE `Class` = 12; + +-- --------------------------------------------------------------- +-- playercreateinfo (10 rows: every DK-eligible race, racial start) +-- --------------------------------------------------------------- +INSERT INTO `playercreateinfo` (`race`, `class`, `map`, `zone`, `position_x`, `position_y`, `position_z`, `orientation`) VALUES + ( 1, 12, 0, 12, -8949.95, -132.493, 83.5312, 0 ), -- Human -> Northshire, Elwynn Forest + ( 2, 12, 1, 14, -618.518, -4251.67, 38.718, 0 ), -- Orc -> Valley of Trials, Durotar + ( 3, 12, 0, 1, -6240.32, 331.033, 382.758, 6.17716 ), -- Dwarf -> Coldridge Valley, Dun Morogh + ( 4, 12, 1, 141, 10311.3, 832.463, 1326.41, 5.69632 ), -- Night Elf -> Shadowglen, Teldrassil + ( 5, 12, 0, 85, 1676.71, 1678.31, 121.67, 2.70526 ), -- Undead -> Deathknell, Tirisfal + ( 6, 12, 1, 215, -2917.58, -257.98, 52.9968, 0 ), -- Tauren -> Camp Narache, Mulgore + ( 7, 12, 0, 1, -6240.32, 331.033, 382.758, 0 ), -- Gnome -> Coldridge Valley (shared) + ( 8, 12, 1, 14, -618.518, -4251.67, 38.718, 0 ), -- Troll -> Valley of Trials (shared) + (10, 12, 530, 3431, 10349.6, -6357.29, 33.4026, 5.31605 ), -- Blood Elf -> Sunstrider Isle, Eversong + (11, 12, 530, 3526, -3961.64,-13931.2, 100.615, 2.08364 ); -- Draenei -> Ammen Vale, Azuremyst Isle + +-- --------------------------------------------------------------- +-- playercreateinfo_action (46 rows) +-- Buttons: 72=Attack(6603), 73=Eat(78), 74=racial, 75=race-extra, +-- 82=Skinning(59752, Tauren only), 84=Attack, 96=Attack +-- --------------------------------------------------------------- +INSERT INTO `playercreateinfo_action` (`race`, `class`, `button`, `action`, `type`) VALUES + ( 1, 12, 72, 6603, 0), ( 1, 12, 73, 78, 0), ( 1, 12, 82, 59752, 0), + ( 1, 12, 84, 6603, 0), ( 1, 12, 96, 6603, 0), + ( 2, 12, 72, 6603, 0), ( 2, 12, 73, 78, 0), ( 2, 12, 74, 20572, 0), + ( 2, 12, 84, 6603, 0), ( 2, 12, 96, 6603, 0), + ( 3, 12, 72, 6603, 0), ( 3, 12, 73, 78, 0), ( 3, 12, 74, 20594, 0), + ( 3, 12, 75, 2481, 0), ( 3, 12, 84, 6603, 0), ( 3, 12, 96, 6603, 0), + ( 4, 12, 72, 6603, 0), ( 4, 12, 73, 78, 0), ( 4, 12, 74, 58984, 0), + ( 4, 12, 84, 6603, 0), ( 4, 12, 96, 6603, 0), + ( 5, 12, 72, 6603, 0), ( 5, 12, 73, 78, 0), ( 5, 12, 74, 20577, 0), + ( 5, 12, 84, 6603, 0), ( 5, 12, 96, 6603, 0), + ( 6, 12, 72, 6603, 0), ( 6, 12, 73, 78, 0), ( 6, 12, 74, 20549, 0), + ( 6, 12, 84, 6603, 0), ( 6, 12, 96, 6603, 0), + ( 7, 12, 72, 6603, 0), ( 7, 12, 73, 78, 0), ( 7, 12, 84, 6603, 0), + ( 7, 12, 96, 6603, 0), + ( 8, 12, 72, 6603, 0), ( 8, 12, 73, 78, 0), ( 8, 12, 74, 2764, 0), + ( 8, 12, 75, 26297, 0), ( 8, 12, 84, 6603, 0), ( 8, 12, 96, 6603, 0), + (11, 12, 72, 6603, 0), (11, 12, 73, 78, 0), (11, 12, 74, 28880, 0), + (11, 12, 84, 6603, 0), (11, 12, 96, 6603, 0); + +-- --------------------------------------------------------------- +-- player_class_stats (80 rows: levels 1..80 per-class base stats) +-- Curve mirrors Warrior baseline -> Paladin past 60 (vehicle-style HP +-- inflation past 60 to keep Paragon competitive in Wrath content). +-- --------------------------------------------------------------- +INSERT INTO `player_class_stats` (`Class`, `Level`, `BaseHP`, `BaseMana`, `Strength`, `Agility`, `Stamina`, `Intellect`, `Spirit`) VALUES + (12, 1, 20, 60, 23, 20, 22, 20, 20), + (12, 2, 29, 66, 24, 21, 23, 20, 20), + (12, 3, 38, 73, 25, 21, 24, 20, 21), + (12, 4, 47, 81, 26, 22, 25, 20, 21), + (12, 5, 56, 90, 28, 23, 26, 20, 21), + (12, 6, 65, 100, 29, 24, 27, 21, 21), + (12, 7, 74, 111, 30, 24, 28, 21, 22), + (12, 8, 83, 123, 31, 25, 29, 21, 22), + (12, 9, 92, 136, 32, 26, 30, 21, 22), + (12, 10, 97, 150, 33, 26, 31, 21, 23), + (12, 11, 103, 165, 35, 27, 33, 21, 23), + (12, 12, 109, 182, 36, 28, 34, 21, 23), + (12, 13, 118, 200, 37, 29, 35, 21, 24), + (12, 14, 128, 219, 39, 30, 36, 22, 24), + (12, 15, 139, 239, 40, 30, 37, 22, 24), + (12, 16, 151, 260, 41, 31, 38, 22, 25), + (12, 17, 154, 282, 42, 32, 40, 22, 25), + (12, 18, 168, 305, 44, 33, 41, 22, 25), + (12, 19, 183, 329, 45, 34, 42, 22, 26), + (12, 20, 199, 354, 47, 35, 43, 22, 26), + (12, 21, 206, 380, 48, 35, 45, 23, 26), + (12, 22, 224, 392, 49, 36, 46, 23, 27), + (12, 23, 243, 420, 51, 37, 47, 23, 27), + (12, 24, 253, 449, 52, 38, 49, 23, 28), + (12, 25, 274, 479, 54, 39, 50, 23, 28), + (12, 26, 296, 509, 55, 40, 51, 23, 28), + (12, 27, 309, 524, 57, 41, 53, 23, 29), + (12, 28, 333, 554, 58, 42, 54, 24, 29), + (12, 29, 348, 584, 60, 43, 56, 24, 30), + (12, 30, 374, 614, 62, 44, 57, 24, 30), + (12, 31, 401, 629, 63, 45, 58, 24, 30), + (12, 32, 419, 659, 65, 46, 60, 24, 31), + (12, 33, 448, 689, 66, 47, 61, 24, 31), + (12, 34, 468, 704, 68, 48, 63, 25, 32), + (12, 35, 499, 734, 70, 49, 64, 25, 32), + (12, 36, 521, 749, 72, 50, 66, 25, 33), + (12, 37, 545, 779, 73, 51, 68, 25, 33), + (12, 38, 581, 809, 75, 52, 69, 25, 33), + (12, 39, 609, 824, 77, 53, 71, 26, 34), + (12, 40, 649, 854, 79, 54, 72, 26, 34), + (12, 41, 681, 869, 80, 56, 74, 26, 35), + (12, 42, 715, 899, 82, 57, 76, 26, 35), + (12, 43, 761, 914, 84, 58, 77, 26, 36), + (12, 44, 799, 944, 86, 59, 79, 26, 36), + (12, 45, 839, 959, 88, 60, 81, 27, 37), + (12, 46, 881, 989, 90, 61, 83, 27, 37), + (12, 47, 935, 1004, 92, 63, 84, 27, 38), + (12, 48, 981, 1019, 94, 64, 86, 27, 38), + (12, 49, 1029, 1049, 96, 65, 88, 28, 39), + (12, 50, 1079, 1064, 98, 66, 90, 28, 39), + (12, 51, 1131, 1079, 100, 68, 92, 28, 40), + (12, 52, 1185, 1109, 102, 69, 94, 28, 40), + (12, 53, 1241, 1124, 104, 70, 96, 28, 41), + (12, 54, 1299, 1139, 106, 72, 98, 29, 42), + (12, 55, 1359, 1154, 109, 73, 100, 29, 42), + (12, 56, 1421, 1169, 111, 74, 102, 29, 43), + (12, 57, 1485, 1199, 113, 76, 104, 29, 43), + (12, 58, 1551, 1214, 115, 77, 106, 30, 44), + (12, 59, 1619, 1229, 118, 79, 108, 30, 44), + (12, 60, 1689, 1244, 120, 80, 110, 30, 45), + (12, 61, 1902, 1357, 122, 81, 112, 30, 46), + (12, 62, 2129, 1469, 125, 83, 114, 30, 46), + (12, 63, 2357, 1582, 127, 84, 117, 31, 47), + (12, 64, 2612, 1694, 130, 86, 119, 31, 47), + (12, 65, 2883, 1807, 132, 88, 121, 31, 48), + (12, 66, 3169, 1919, 135, 89, 123, 32, 49), + (12, 67, 3455, 2032, 137, 91, 126, 32, 49), + (12, 68, 3774, 2145, 140, 92, 128, 32, 50), + (12, 69, 4109, 2257, 142, 94, 130, 32, 51), + (12, 70, 4444, 2370, 145, 96, 133, 33, 51), + (12, 71, 4720, 2482, 148, 97, 135, 33, 52), + (12, 72, 5013, 2595, 150, 99, 138, 33, 53), + (12, 73, 5325, 2708, 153, 101, 140, 33, 54), + (12, 74, 5656, 2820, 156, 102, 143, 34, 54), + (12, 75, 6008, 2933, 159, 104, 145, 34, 55), + (12, 76, 6381, 3045, 162, 106, 148, 34, 56), + (12, 77, 6778, 3158, 165, 108, 151, 35, 57), + (12, 78, 7198, 3270, 168, 109, 153, 35, 57), + (12, 79, 7646, 3383, 171, 111, 156, 35, 58), + (12, 80, 8121, 3496, 174, 113, 159, 36, 59);