fix(world): reconstruction données d'entraînement métiers (lots 5-6)

Lot 5 : 103 maîtres de métier sans aucune donnée (alchimie, forge,
enchantement, joaillerie, cuir, couture, calligraphie, premiers soins,
pêche, herboristerie, minage, dépeçage, archéologie, cuisine) reçoivent
la liste de sorts canonique de leur profession via référence-donneur
npc_trainer (feuilles pures existantes). + option gossip sur menus dédiés.

Lot 6 : profession Ingénierie entièrement reconstruite depuis TDB735
officiel (TrainerId 407, 222 recettes skill 202) -> donneur 3290, 38
maîtres d'ingénierie référencent -3290, + options gossip.

Données legacy npc_trainer = effet au prochain restart (LoadTrainerSpell
au boot). Options gossip rechargées à chaud. Rollbacks fournis.
Maîtres de CLASSE intacts (Legion : sorts appris au niveau).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
SylvaniaCore deploy
2026-06-18 21:15:52 +00:00
parent 6e0d1a0e80
commit 29b2a1c7f0
4 changed files with 224 additions and 0 deletions
File diff suppressed because one or more lines are too long
@@ -0,0 +1,19 @@
-- ============================================================================
-- ROLLBACK — Lot 6 Ingénierie (trainers_engineering_lot6_20260618)
-- Base : dc_world | Date : 2026-06-18
-- A) recettes du donneur 3290 ; B) références -3290 ; C) options gossip.
-- (3290 n'avait aucune ligne npc_trainer avant ce lot.)
-- ============================================================================
SET NAMES utf8;
-- A) recettes donneur
DELETE FROM npc_trainer WHERE ID = 3290 AND SpellID > 0;
-- B) références
DELETE FROM npc_trainer WHERE SpellID = -3290;
-- C) options gossip (menus dédiés ingénierie)
DELETE FROM gossip_menu_option
WHERE OptionType = 5 AND OptionNpcFlag = 16 AND OptionText = 'Je voudrais m''entraîner.'
AND (MenuId, OptionIndex) IN (
(1465,0),(1467,0),(1468,1),(1469,0),(4136,0),(4137,0),(4147,0)
);
@@ -0,0 +1,111 @@
-- ============================================================================
-- La Légion de Sylvania — Lot 5 : données d'entraînement pour les maîtres de
-- métier « sans données » (hors Ingénierie, traitée séparément lot 6).
-- Base : dc_world (LIVE) | Date : 2026-06-18
-- ----------------------------------------------------------------------------
-- CONTEXTE
-- ~103 maîtres de métier spawnés n'avaient AUCUNE donnée d'entraînement (ni
-- schéma moderne `trainer`, ni legacy `npc_trainer`) -> fenêtre vide même
-- quand l'option de gossip existait. Le contenu manque à la source TC
-- (TDB735 officiel n'a que 93 trainers modernes et pas de npc_trainer).
-- MAIS chaque profession dispose déjà, dans ce monde, d'un maître COMPLET
-- (donneur « feuille pure ») dont on réutilise la liste de sorts.
--
-- Découverte : le menu 0 est le menu universel auto-généré ; il contient
-- déjà l'option « Train me! » (OptionType=5, OptionNpcFlag=16). Donc tout
-- trainer à gossip_menu_id=0 propose déjà l'entraînement DÈS qu'il a des
-- données. Seuls les menus DÉDIÉS (<>0) ont besoin d'une option explicite.
-- ----------------------------------------------------------------------------
-- DONNEURS feuilles pures (entry -> nb sorts) :
-- Alchimie 1215(143) Forge 7230(248) Enchantement 1317(193)
-- Joaillerie 65098(290) Cuir 1385(278) Couture 57405(235)
-- Calligraphie 92195(148) Premiers soins 126022(36) Pêche 1680(17)
-- Herboristerie 1218(8) Minage 93189(36) Dépeçage 1292(8)
-- Archéologie 93538(10) Cuisine 93536(52)
-- Réutilisation via le mécanisme natif npc_trainer (SpellID négatif =
-- « hérite de tous les sorts du donneur », cf ObjectMgr::LoadTrainerSpell).
-- PÉRIMÈTRE : professions hors Ingénierie. Maîtres de CLASSE intacts
-- (en Legion les sorts de classe s'apprennent au niveau, pas d'un PNJ).
-- EFFET : restart world OU `.reload npc_trainer`(si dispo) + `.reload
-- gossip_menu_option`. ROLLBACK : ..._lot5_ROLLBACK.sql
-- ============================================================================
SET NAMES utf8;
-- ---------------------------------------------------------------------------
-- PART A — Données : 1 ligne de référence-donneur par maître de métier vide.
-- ---------------------------------------------------------------------------
INSERT INTO npc_trainer (ID, SpellID, MoneyCost, ReqSkillLine, ReqSkillRank, ReqLevel, `Index`)
SELECT ct.entry,
-(CASE
WHEN ct.subname LIKE '%Alchem%' THEN 1215
WHEN ct.subname LIKE '%Blacksmith%' THEN 7230
WHEN ct.subname LIKE '%Enchant%' THEN 1317
WHEN ct.subname LIKE '%Jewelcraft%' THEN 65098
WHEN ct.subname LIKE '%Leatherwork%' OR ct.subname LIKE '%Tanner%' THEN 1385
WHEN ct.subname LIKE '%Tailor%' THEN 57405
WHEN ct.subname LIKE '%Inscription%' THEN 92195
WHEN ct.subname LIKE '%First Aid%' THEN 126022
WHEN ct.subname LIKE '%Fish%' OR ct.subname LIKE '%Angler%' THEN 1680
WHEN ct.subname LIKE '%Herbal%' THEN 1218
WHEN ct.subname LIKE '%Mining%' THEN 93189
WHEN ct.subname LIKE '%Skinning%' THEN 1292
WHEN ct.subname LIKE '%Archaeology%' THEN 93538
WHEN ct.subname LIKE '%Cook%' OR ct.subname LIKE '%Chef%' OR ct.subname LIKE '%Brewmaster%' OR ct.subname LIKE '%Noodle%' OR ct.subname LIKE '%Wok%' THEN 93536
ELSE NULL END), 0, 0, 0, 0, 0
FROM creature_template ct JOIN creature c ON c.id=ct.entry
WHERE (ct.npcflag&16)>0 AND (ct.npcflag&32)=0
AND ct.subname NOT LIKE '%Engineer%'
AND NOT EXISTS(SELECT 1 FROM creature_default_trainer cdt WHERE cdt.CreatureId=ct.entry)
AND NOT EXISTS(SELECT 1 FROM npc_trainer nt WHERE nt.ID=ct.entry)
AND NOT EXISTS(SELECT 1 FROM gossip_menu_option g JOIN gossip_menu_option_trainer t
ON t.MenuId=g.MenuId AND t.OptionIndex=g.OptionIndex
WHERE g.MenuId=ct.gossip_menu_id AND g.OptionType=5)
AND (CASE
WHEN ct.subname LIKE '%Alchem%' THEN 1215
WHEN ct.subname LIKE '%Blacksmith%' THEN 7230
WHEN ct.subname LIKE '%Enchant%' THEN 1317
WHEN ct.subname LIKE '%Jewelcraft%' THEN 65098
WHEN ct.subname LIKE '%Leatherwork%' OR ct.subname LIKE '%Tanner%' THEN 1385
WHEN ct.subname LIKE '%Tailor%' THEN 57405
WHEN ct.subname LIKE '%Inscription%' THEN 92195
WHEN ct.subname LIKE '%First Aid%' THEN 126022
WHEN ct.subname LIKE '%Fish%' OR ct.subname LIKE '%Angler%' THEN 1680
WHEN ct.subname LIKE '%Herbal%' THEN 1218
WHEN ct.subname LIKE '%Mining%' THEN 93189
WHEN ct.subname LIKE '%Skinning%' THEN 1292
WHEN ct.subname LIKE '%Archaeology%' THEN 93538
WHEN ct.subname LIKE '%Cook%' OR ct.subname LIKE '%Chef%' OR ct.subname LIKE '%Brewmaster%' OR ct.subname LIKE '%Noodle%' OR ct.subname LIKE '%Wok%' THEN 93536
ELSE NULL END) IS NOT NULL
GROUP BY ct.entry;
-- ---------------------------------------------------------------------------
-- PART B — Option « s'entraîner » sur les MENUS DÉDIÉS (<>0) des maîtres de
-- métier gossip-flaggés qui n'en ont pas. (menu 0 jamais touché.)
-- OptionNpcFlag=16 -> visible uniquement pour les dresseurs. TrainerId=0 ->
-- fallback legacy. OptionIndex = MAX+1 par menu. À exécuter APRÈS Part A.
-- ---------------------------------------------------------------------------
INSERT INTO gossip_menu_option
(MenuId, OptionIndex, OptionIcon, OptionText, OptionBroadcastTextId, OptionType, OptionNpcFlag, VerifiedBuild)
SELECT m.MenuId, m.maxidx+1, 3, 'Je voudrais m''entraîner.', 0, 5, 16, 26972
FROM (
SELECT ct.gossip_menu_id AS MenuId, COALESCE(MAX(g.OptionIndex),-1) AS maxidx
FROM creature_template ct JOIN creature c ON c.id=ct.entry
LEFT JOIN gossip_menu_option g ON g.MenuId=ct.gossip_menu_id
WHERE (ct.npcflag&16)>0 AND (ct.npcflag&32)=0 AND (ct.npcflag&1)>0
AND ct.gossip_menu_id<>0
AND ct.subname NOT LIKE '%Engineer%'
AND EXISTS(SELECT 1 FROM npc_trainer nt WHERE nt.ID=ct.entry)
AND NOT EXISTS(SELECT 1 FROM gossip_menu_option g2 WHERE g2.MenuId=ct.gossip_menu_id AND g2.OptionType=5)
AND (CASE
WHEN ct.subname LIKE '%Alchem%' THEN 1 WHEN ct.subname LIKE '%Blacksmith%' THEN 1
WHEN ct.subname LIKE '%Enchant%' THEN 1 WHEN ct.subname LIKE '%Jewelcraft%' THEN 1
WHEN ct.subname LIKE '%Leatherwork%' OR ct.subname LIKE '%Tanner%' THEN 1
WHEN ct.subname LIKE '%Tailor%' THEN 1 WHEN ct.subname LIKE '%Inscription%' THEN 1
WHEN ct.subname LIKE '%First Aid%' THEN 1 WHEN ct.subname LIKE '%Fish%' OR ct.subname LIKE '%Angler%' THEN 1
WHEN ct.subname LIKE '%Herbal%' THEN 1 WHEN ct.subname LIKE '%Mining%' THEN 1
WHEN ct.subname LIKE '%Skinning%' THEN 1 WHEN ct.subname LIKE '%Archaeology%' THEN 1
WHEN ct.subname LIKE '%Cook%' OR ct.subname LIKE '%Chef%' OR ct.subname LIKE '%Brewmaster%' OR ct.subname LIKE '%Noodle%' OR ct.subname LIKE '%Wok%' THEN 1
ELSE NULL END) IS NOT NULL
GROUP BY ct.gossip_menu_id
) m;
@@ -0,0 +1,34 @@
-- ============================================================================
-- ROLLBACK — Lot 5 (trainers_profession_data_lot5_20260618)
-- Base : dc_world | Date : 2026-06-18
-- Supprime UNIQUEMENT ce que le lot 5 a inséré :
-- A) les lignes de référence-donneur (SpellID<0) des 103 maîtres concernés
-- (ces entrées n'avaient AUCUNE ligne npc_trainer auparavant) ;
-- B) les 33 options de gossip trainer ajoutées sur les menus dédiés.
-- Puis restart world OU reload des tables.
-- ============================================================================
SET NAMES utf8;
-- A) données
DELETE FROM npc_trainer WHERE SpellID < 0 AND ID IN (
223,1246,1383,1386,2798,3007,3008,3009,3069,3549,3605,3607,3703,3964,3965,4213,
4605,4609,5695,6288,6387,7871,7949,8153,10266,10276,10277,10278,11044,11047,
11049,11065,11067,11071,11074,11081,11083,11084,12025,14740,16367,16634,16643,
16671,16687,16688,16703,16723,16725,16727,16740,16741,16744,16745,17424,18018,
18748,18754,18771,18773,18774,18776,18802,19052,19180,19184,19248,19249,19250,
19478,19539,19774,19775,19777,19778,21087,26956,26960,26974,26975,26986,26996,
27023,27029,30715,33639,33641,33674,33678,33683,43431,47573,47574,47578,51997,
53409,53415,62327,66353,66354,66357,66358,66360
);
-- B) options de gossip (menus dédiés)
DELETE FROM gossip_menu_option
WHERE OptionType = 5 AND OptionNpcFlag = 16 AND OptionText = 'Je voudrais m''entraîner.'
AND (MenuId, OptionIndex) IN (
(2742,0),(2747,0),(2748,0),(2761,0),(2782,0),(4116,0),(4119,0),(4134,1),
(4154,0),(4157,0),(4158,0),(4164,1),(4170,0),(4181,0),(4187,0),(4204,0),
(4207,0),(4842,0),(6087,2),(7455,1),(8379,0),(8381,0),(8434,1),(8828,0),
(8863,0),(10350,2),(13291,1),(14582,1),(14624,1),(14628,2),(15098,1),
(15099,1),(15100,1)
);