Commit Graph

122 Commits

Author SHA1 Message Date
sindoring edb998de02 fix 2026-09-12 18:29:57 +04:00
sindoring 4d760528cc перевод на русский 2026-09-12 18:02:23 +04:00
sindoring d9273459d0 Merge remote-tracking branch 'upstream/sylvaniacore' 2026-09-12 16:01:47 +04:00
BlaMacfly 7f0c3a5453 Salles des Valeureux : les 3 boss absents, et Azzakel jamais invoque
Salles des Valeureux (1477) : Hyrja, le Roi-dieu Skovald et Odyn n existaient
dans aucune ligne de creature. Le donjon etait bloque bien avant le butin :
les portes GOB_DOOR_ODYN_PASSAGE et GOB_DOOR_ODYN_BRIDGE sont des passages
commandes par DATA_HYRJA, qui restait donc NOT_STARTED pour toujours - la
moitie arriere du donjon etait inaccessible. Apparitions ajoutees pour Hyrja,
Olmyr, Solsten, Skovald et Odyn ; Odyn n avait pas de table de butin, il est
branche sur sa rencontre du Guide d aventure (1489).

Auchindoun : Azzakel n etait pas un boss absent mais un boss jamais invoque.
Le controleur qui l invoque est Claws of Argus (76216) apres la mort de six
Cackling Pyromaniac ; or la mort de ces derniers envoyait le compteur a la
creature 87218, un simple marqueur de position sans IA - l action tombait
dans le vide. Le compteur passe desormais par les donnees d instance
(DataTriggerAzzakelController). Corrige au passage une condition inversee
dans l invocation (if (!m_Azzakel) au lieu de if (!m_Azzakel.IsEmpty())),
qui empechait Azzakel de devenir hostile et de charger la plateforme.
2026-09-10 20:05:58 +02:00
BlaMacfly fa6d14c4a0 Butin WoD/Legion : brancher les boss sur le Guide d aventure
Signalement Discord : les instances haut niveau ne lachent aucun equipement.

Sur ce core, le butin d equipement des boss modernes ne vient pas de
creature_loot_template mais de Unit::Kill, qui lit creature_template_journal
(entree -> JournalEncounterID) puis tire 2 objets dans JournalEncounterItem.db2
avec le bon masque de difficulte et le bon contexte d objet. Cette table ne
contenait que 45 lignes, toutes Burning Crusade : aucun boss de Draenor ni de
Legion, et ces boss ont lootid = 0. Ils ne lachaient donc rigoureusement rien.

44 correspondances ajoutees, etablies depuis les DB2 officiels du client
(JournalInstance -> JournalEncounter -> JournalEncounterCreature ->
CreatureDisplayInfoID -> creature_template.modelid), une seule creature par
rencontre et uniquement celles sans table de butin, pour ne rien doubler.
Couvre entre autres la Fonderie des Rochenoire (10 boss), les Docks de fer,
Haut-perchoir, le Pic Rochenoire, la Floraison eternelle, le Siege du
Triumvirat (4 boss), le Tombeau de Sargeras (6), Gul dan et Elisande.

Les scripts de generation et de verification sont dans chantiers/butin-journal.
2026-09-10 19:50:19 +02:00
BlaMacfly afb770d096 Mascottes de combat : soin chez le maitre d ecurie et criteres de hauts faits
Signalement Discord : la quete 31589 (Panser ses plaies) est impossible a
valider, un clic sur Murog ouvre directement la boutique.

Donnees (sql/sylvania/battlepet_stablemaster_heal.sql) :
- Murog (47764) et Jaelysia (10085) n avaient aucun gossip_menu_id : ils
  retombaient sur le menu 0, dont la seule option compatible pour un
  non-chasseur est le vendeur, que le client selectionne automatiquement.
- le menu 9821 des maitres d ecurie avait perdu ses options vendeur et
  ecurie : seule restait l option de soin.
- 10 des 12 maitres d ecurie de la chaine On The Mend n avaient pas le
  SmartAI qui soigne les mascottes et donne le credit de quete.
- le credit de Jenova Stoneshield pointait sur Elwynn (64320) au lieu de
  Hurlevent (65214).

Core :
- CRITERIA_TYPE_BATTLEPET_WIN, _LEVEL_UP et CAPTURE_PET_IN_BATTLE etaient
  dans la liste  non implemente  : le systeme de combat de mascottes
  remontait bien les evenements, le gestionnaire de criteres les jetait.
- l ordre des miscValue de _LEVEL_UP ne correspondait pas a ce qu attendent
  les conditions (espece en miscValue1, niveau en miscValue2).
2026-09-10 19:28:17 +02:00
BlaMacfly 77fa13a929 Ken-Ken etait hostile a tout le monde
Faction 14 alors qu il porte le drapeau de dialogue : aucun joueur ne pouvait
lui parler. Meme classe d erreur que Khadgar 78288, trouvee par le meme signal
d incoherence interne : sur les 8 entrees Ken-Ken de la base, six sont en
faction 35 et celle-ci etait la seule en 14. Wowhead le donne amical envers
l Alliance et la Horde.

Deux spawns concernes, foret de Jade.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-07 23:31:10 +02:00
BlaMacfly fb959731ce Khadgar etait hostile a l Alliance a Crete-de-Gel
Signalement : un personnage Alliance debarquant a Crete-de-Gel se fait attaquer
par trois PNJ. Deux sont conformes, Thrall et Farseer Drek Thar sont des chefs de
la Horde et Wowhead les donne hostiles a l Alliance. Le troisieme non.

Khadgar est neutre dans tout Draenor, il sert les deux factions. Wowhead donne
cette entree amicale envers les deux camps, et notre propre base le confirme :
sur 150 entrees Archmage Khadgar, 100 sont en faction 35 et 78288 etait la seule
en faction 83. Deux spawns concernes, tous deux en zone 6720.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-07 23:27:16 +02:00
Sylvania f6ad8117c6 Depecage : 14 betes des Iles Brisees n en avaient aucun
81 betes spawnees avaient skinloot = 0. Relevees sur l onglet skinning de
Wowhead, distinct de celui des butins, avec controle du statut HTTP et du
marqueur g_npcs. Aucun refus rencontre.

67 n ont aucun onglet depecage sur Wowhead : oiseaux, insectes, gasteropodes,
araignees. Verifie a la main sur cinq d entre elles, l absence est reelle.
Elles ne sont pas touchees. Restent 14 betes, 66 lignes.

Methode validee AVANT collecte sur un temoin dont la table existait deja
(90134 Llothien Grizzly) : memes objets, memes intervalles de pile, ecarts de
taux sous le bruit. Sans ce temoin le relevé aurait rendu zero partout : l
onglet skinning n est pas du JSON strict comme celui des butins, ses cles sont
non quotees et une espace precede outof.

Controle : 11 479 lignes chargees pour 11 479 en base, aucun rejet.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-07 23:08:07 +02:00
Sylvania a55cc4fd64 Butin : reparation des 142 lignes rejetees au chargement
Reparation et non suppression : ces lignes portaient du butin reel, rendu
inoperant par deux defauts d import distincts.

62 lignes a chance negative sur 35 creatures : signe inverse a l import. Les
memes objets figurent ailleurs dans la table avec la meme valeur en positif
(69815 entre 50 et 100, 71141 entre 75 et 100). Valeur absolue retablie.

80 lignes a chance nulle sans GroupId sur 6 boss de points d invasion majeurs
d Argus : encodage classique d un groupe equiprobable dont le GroupId manquait,
donc tout etait rejete et ces boss ne lachaient rien. Verifie sur Wowhead,
Mistress Alluradel liste exactement les 14 memes objets que nous.

Resultat : 932 578 lignes chargees sur 932 578 en base, plus aucun rejet.
41 creatures retrouvent leur butin.
2026-09-07 22:59:24 +02:00
Sylvania 5427805396 Butin : quetes 41039 et 46765, plus reliquat des Iles Brisees
Quete 41039 : son objet 133995 Recette du breuvage des tempetes existe dans
Item.db2 mais pas dans ItemSparse.db2, or le core exige les deux. Verifie par le
serveur lui-meme : 104 011 ItemTemplate charges pour 103 967 enregistrements
ItemSparse, donc le fichier est lu en entier. Cree par hotfix DB2 (table miroir +
hotfix_data, TableHash 0x919BE54E) et HotfixCacheVersion passe de 1 a 2.

Quete 46765 : objet 147430 absent de toute table de butin. 199 lacheurs listes
par Wowhead, 58 spawnes chez nous, 49 lachent effectivement l objet. Taux releves
sur les fiches PNJ, QuestRequired = 1.

Reliquat des 67 especes : 53 n ont aucune donnee Wowhead, 11 n ont que des objets
post-Legion. Restaient 3 cas reels, tous traites : 102852 par le hotfix, 100231
par la Meteorite gangrenee, 113198 par une table de depecage.
2026-09-07 22:45:03 +02:00
Sylvania d863aca69a Butin : objets de quete manquants des Iles Brisees
Trois objectifs de quete (quest_objectives Type 1) n existaient dans aucune table
de butin du serveur : 142079, 144362, 147396. Poses avec QuestRequired = 1.

Taux repris de la fiche PNJ de Wowhead et non de la fiche objet : les deux
divergent (Gemme pulsatile a 19,66 pour cent cote objet contre 82 cote PNJ),
et c est la fiche PNJ qui est juste, verifiee a l ecran.

Les trois quetes sont des quetes MONDIALES (QuestType 3, QuestInfoID 109) : sans
donneur par construction, leur disponibilite depend du systeme de quetes mondiales.

41039 Un savoir vole non traitee : seule quete classique du lot, donc la seule
reellement bloquee, mais son objet 133995 n existe pas dans ItemSparse. Le serveur
rejette la ligne au chargement. Demande un DB2 custom par hotfix.
2026-09-07 12:41:49 +02:00
Sylvania 65365ce331 Butin : 35 especes des Iles Brisees ne lachaient rien
Filtre affine par HealthModifier >= 1, qui ecarte decors et critters.
102 especes hostiles a lootid = 0 relevees sur Wowhead, statut HTTP et marqueur
g_npcs controles.

Wowhead agrege le jeu moderne : 3727 lignes brutes, 235 retenues apres trois
filtres. Ecartes : objets absents de notre Item.db2, taux sous 1 pour cent, et
objets jamais utilises comme butin de cadavre chez nous. Ce dernier ecarte les
materiaux a dominante depecage (124113 Cuir de rochepeau : 19 usages en butin
contre 284 en depecage) et les objets de quete qui exigeraient QuestRequired.

Objet dominant : 124437 Soie shal dorei a environ 50 pour cent sur les
humanoides, equivalent Legion des Fragments d armure abimes du Draenor.
2026-09-07 11:44:12 +02:00
Sylvania 7ade5297a5 Butin : suite du Draenor, 15 especes sur les 245 annoncees
Les 245 especes hostiles a lootid = 0 de la carte 1116 relevees une par une sur
Wowhead. 222 n ont effectivement aucun butin sur les royaumes officiels non plus :
decors, critters, PNJ scenarises, envahisseurs de fief. 8 autres n ont que des
objets post-Legion, absents de notre Item.db2. Restent 15 especes, 65 lignes.

Le chiffre de 21 pour cent de mobs hostiles sans butin annonce plus tot etait
trompeur : le filtre laissait passer des objets de decor classes humanoides ou
betes en base (Renfort de fer, 294 spawns, Champignon gorge...).

Le releve controle desormais le statut HTTP 200 et le marqueur g_npcs : sans ca
une page de refus 403 se lit exactement comme un PNJ sans butin. 8 refus
rencontres et rattrapes sur cette passe.
2026-09-07 11:33:31 +02:00
Sylvania 95ba4466e1 Butin : 17 mobs des quetes d acces a Draenor ne lachaient rien
Signalement joueur du 05/09. 26 especes hostiles des Terres foudroyees 6.0 et de
Tanaan avaient lootid = 0, alors que leurs voisines immediates avaient leur table.

Taux releves un par un sur Wowhead. 9 des 26 n ont legitimement aucun butin la-bas
non plus et ne sont pas touchees : ame tourmentee, demolisseur, Keli dan, Ankova...
Les objets post-Legion listes par Wowhead (ids 235xxx et 236xxx) sont ecartes.

Profil dominant de la Marche-de-Fer : 112463 a 75-99 pour cent, 112684 a 29-41,
118675 a 0,2-0,4.
2026-09-07 11:07:47 +02:00
Sylvania d681f73f54 Fief WoD : aucun moyen de rentrer dans un fief deja fonde
Les deux points d entree ne se declenchent que si le joueur n a PAS encore de
fief : l objet Master Surveyor (233664, Horde) et Baros Alexston (79243,
Alliance). Une fois le fief fonde, plus rien n y ramenait. Les trois joueurs du
royaume qui en possedent un ne sont jamais alles dessus : aucun personnage n a
jamais ete sur les cartes 1152, 1153, 1158, 1159, 1330 ni 1331.

Gazlowe (78466) et Baros proposent desormais "Emmenez-moi a mon fief" aux
proprietaires. L option est masquee quand on est deja sur une carte de fief,
Gazlowe y etant aussi spawne. Le declencheur de proximite cote Horde n est pas
touche : il aurait teleporte tout passant.

TeleportOwnerAndPlayMovie renomme TeleportOwnerToGarrison, l ancien nom mentait
depuis le retrait du film.
2026-09-07 10:34:22 +02:00
Sylvania 05af3e02f2 Coup d oeil dans le portail : la version Horde n avait aucun spawn
Scout Pazaztick (85249) et son telescope (234619) ne sont spawnes nulle part.
Les joueurs Horde tombaient donc sur la paire Alliance : telescope inutilisable
(il ne valide que la quete 36379) et Scout Pazerp, en faction 84, les agresse.

Faute de phasing sur la map 1190, le telescope existant sert desormais aux deux
factions, les deux eclaireuses passent en faction 35 et Pazaztick est spawnee.
2026-09-05 16:22:27 +02:00
BlaMacfly bd22c62631 Rivage brise : embarquement sur le navire, escorte de mercenaires, factions
L'exploitant a fourni une seconde video, en 1080p et sans ecran partage,
qui montre le vrai depart cote Alliance. Elle a permis quatre
corrections.

L'EMBARQUEMENT. Le script d'Angelica deposait le joueur en
(443.8, 2076.1, 1.2), le point d'ancrage de la plage -- une coordonnee
inventee. Le sort officiel 199358 porte (441.2, 2023.75, 4.44) dans
spell_target_position, marque VerifiedBuild 27843 : le pont de
l'Alliance Battleship. On y teleporte desormais. La premiere etape
s'intitule « Rendez-vous au rivage Brise » et ne s'acheve qu'une fois
le joueur debarque, au lieu d'une minuterie de douze secondes qui
s'ecoulait pendant le chargement du client.

Sa condition exigeait par ailleurs que la quete 42740 soit EN COURS :
deja rendue ou pas encore prise, l'option restait muette. Elle accepte
maintenant les trois etats et explique le refus au lieu de ne rien
faire.

LES FACTIONS, et la resolution du paradoxe d'aout. On avait bascule les
demons de cette carte en faction 16 parce que la 2780 les rendait
inattaquables, sans comprendre pourquoi. Le prix etait invisible : la
faction 16 porte EnemyGroup = 1, elle n'est hostile QU'AUX JOUEURS. Nos
allies, eux, ont EnemyGroup = 0 et une liste d'ennemis qui designe la
faction 1786. Les deux camps ne se reconnaissaient pas -- d'ou les
soldats qui s'engagent puis n'ont personne a frapper, releve par la
sonde d'evasion : onze fois pour la garde royale gilneenne, dix pour
Jaina, dix pour Varian.

On avait repare le joueur en supprimant la bataille. Les 102 entrees
exclusives a la carte passent en 2898, qui porte la meme faction 1786
mais avec EnemyGroup = 15, hostile a tous. Verifie en jeu : attaquable.

L'ESCORTE. Le scenario officiel se joue en groupe constitue par la file
d'attente, que nous n'avons pas. A l'entree, une escorte est desormais
offerte : un protecteur, un guerisseur et deux combattants, via le
module des mercenaires. Un mode gratuit y est ajoute -- le contrat reste
identique, rupture au premier depart du groupe, mais sans prelevement.
Les invocations sont espacees d'une seconde et demie, faute de quoi
elles se superposaient au meme point.

LES DOUBLONS DE DISTRIBUTION. Quatrieme et cinquieme occurrences du meme
defaut : le script invoquait Genn, Jaina, Mekkatorque, l'escorte et
Arganoth alors que la carte les porte tous. Toutes les invocations de
l'introduction sont supprimees ; c'est Genn qui ouvre la scene cote
Alliance, Varian n'etant pas encore la -- ce qui est tout l'objet de
l'etape « Trouver Varian ».

Corrige aussi : Gul'dan Talk(1) n'existait pas, le script l'appelait
dans la finale et rien ne se jouait. 263 allies passent en arme
degainee, 131 recoivent un equipement recupere de la reference et la
posture EMOTE_STATE_READY1H.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-05 09:42:29 +02:00
BlaMacfly 346bd9c200 Rivage brise : Tirion introuvable, allies desarmes, intro inaudible
SIGNALE EN JEU : « p7 Tirion reste muet, le script ne se lance plus,
mais Krosus est bien combattable ». Un seul defaut, deux symptomes.

La verification de proximite sortait SANS SE REPLANIFIER quand Tirion
n'etait pas encore charge -- sa zone se trouve a l'autre bout de la
carte, et la grille ne se peuple qu'a l'approche du joueur. Au premier
passage, deux secondes apres la fin de l'etape 6, il n'existait pas : la
tache mourait la, definitivement. D'ou Tirion muet, et d'ou Krosus
combattable, puisque c'est cette meme scene qui devait le figer.

Le meme Repeat existait deja dans la detection de Varian ; je ne l'avais
pas reporte ici.

« Varian a un dialogue audio au lancement de la campagne, il ne se
declenche pas. » StartIntro etait appele DANS OnPlayerEnter, pendant
l'ajout du joueur a la carte : le cri partait quand le client chargeait
encore la zone. Decale de quatre secondes. Corrige au passage le
demarrage direct en phase 2, meme cause -- les douze secondes de la
premiere phase s'ecoulaient avant l'arrivee effective.

« Tous les PNJ allies doivent porter leurs armes. » L'etat de fourreau
ne suffisait pas : il n'y avait rien a degainer. Sur les 51 entrees
alliees de la carte, seules QUATRE avaient un equipement defini.
Trente equipements recuperes du creature_equip_template de la
reference : 131 spawns sont desormais armes, contre 11.

Les 263 allies passent aussi en arme degainee, sans emote d'etat --
l'emote 27 demandee est celle du combat A MAINS NUES et aurait range
leurs armes. Sans emote forcee, le client joue l'attitude propre a
l'arme reellement portee, hache a deux mains comme epee courte.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-05 00:44:26 +02:00
BlaMacfly 0032c28f21 Rivage brise : plus aucune vague, Krosus attaquable, Tirion atteignable
Trois signalements en jeu, une cause commune pour deux d'entre eux.

« Il y a toujours ces vagues de demons qui m'attaquent, RETIRE-LES. »
Le script a ete ecrit quand la carte etait VIDE : il fabriquait ses
propres ennemis a la plage, chez le commandant, dans la cite et au
tombeau. Elle porte aujourd'hui 748 creatures posees, et toutes ces
invocations faisaient double emploi. Supprimees aux quatre endroits.

« La p9 vaincre Gul'dan se valide toute seule. » Meme origine : elle
s'achevait apres huit morts de demons, or le script en invoquait
lui-meme quatre au tombeau puis quatre autres vingt secondes plus tard.
Il declenchait sa propre condition de fin. L'etape se conclut desormais
au terme de la sequence de Gul'dan, une fois ses repliques prononcees.

« Le Krosus du lac de lave en p8 est inattaquable. » Il portait la
faction 2878 -- exactement le defaut resolu en aout pour les autres
demons de cette carte, ou 2780 et 1768 les rendaient inattaquables et
avaient toutes ete basculees en 16. La 2878 n'etait pas dans le lot,
personne n'etant jamais alle aussi loin dans le scenario. L'entree
90544 n'existe QUE sur la carte 1460, un seul exemplaire.

« Le scenario ne se declenche que si on saute dans la lave. » Tirion
agonise au bord du bassin a z=40, Krosus etant a z=35 : avec un rayon
de 25 metres, le seul point qui satisfaisait la condition etait la lave
elle-meme. Porte a 50.

Les poids de la barre de l'etape 6 montent d'un cran -- 5 pour les
demons ordinaires, 10 pour les elites -- la progression ayant ete
jugee trop lente en jeu. Avec 2 et 5, la cite plafonnait a 273 points
sur 300, ce qui expliquait aussi les vagues que j'avais ajoutees pour
compenser puis retirees.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-05 00:25:31 +02:00
BlaMacfly 5f5317dee3 Rivage brise : employer les PNJ de la carte, couper les vagues, etendre les voix
SIGNALE EN JEU, trois points.

« Tu ne les as pas implementes au Tirion et Krosus qu il y avait de base
sur la map, tu en as ajoute. » Exact, et c est la meme faute que pour
Varian avant-hier. Les protagonistes de la crevasse SONT poses sur la
carte, mais sous d autres entrees que celles du script :

    91951  Highlord Tirion Fordring  (1495, 1751)
    94276  Gul dan                   (1530, 1742)
    90544  Krosus                    (1481, 1716)
    90705  Dread Commander Arganoth  ( 613, 2085)

Le script invoquait des sosies aux entrees 90367 et 90413, qui ne
figurent nulle part. OnCreatureCreate retient desormais les quatre, et
la scene de la mort de Tirion emploie ceux de la base -- Krosus n est
plus duplique, il est seulement rendu inerte le temps de la sequence.

« Ces invocations de demon, il faut arreter ca, a chaque fois que je me
bats ils reviennent en vague, c est affreux. » Supprimees. Elles etaient
une addition de ma part pour permettre a la barre d atteindre ses 300
points -- un pansement pose sur une deduction incertaine, qui rendait le
combat interminable. Si la barre plafonne, c est la correspondance des
poids qu il faudra revoir, pas le nombre d ennemis.

« Les voix qui marchent, Tirion Krosus et Gul dan, c est les seules. »
Confirmation du mecanisme : seules ces repliques portaient un
BroadcastTextId. Les autres sont nos textes inventes, avec un zero dans
ce champ, donc muettes par construction. Sept repliques de mise en scene
recoivent leur identifiant et leur son officiels -- le ralliement de
Varian et de Vol jin, la mort de Varian, Jaina, Sylvanas, et les deux
repliques finales de Gul dan.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-05 00:06:59 +02:00
BlaMacfly a9f2fde270 Rivage brise : la mort de Tirion, et les renforts qui tombaient sur le joueur
SIGNALE EN JEU : « p7 c'est Krosus qui plonge Tirion dans le fiel
normalement, et la pas de script de scenario ». Le script se contentait
d'invoquer Krosus douze secondes apres avoir pose Tirion agenouille.

La sequence officielle est relevee sur Warcraft Wiki, et ses huit
repliques existent dans nos donnees avec leur BroadcastTextId ET leur
Sound -- de 99237 a 99247. Elle est desormais jouee en trente-trois
secondes : Tirion comprend le piege, Gul'dan lui repond depuis le
tombeau, Krosus surgit de la lave, Gul'dan ordonne, Krosus souffle,
Tirion sombre, le chef de faction riposte, Gul'dan raille puis lance
l'assaut. Krosus n'est attaquable qu'a ce dernier signal.

Gul'dan est invoque des cette scene, au sommet du tombeau, et y reste
jusqu'a la fin -- c'est de la qu'il domine le champ de bataille. La
finale le reutilise au lieu d'en invoquer un second.

RENFORTS DE LA CITE : « en phase 6 j'ai des invocations de demon sur ma
tronche ». Ils naissaient au point de ralliement, c'est-a-dire au
milieu du combat. Ils arrivent desormais de la peripherie, sur un
cercle de 45 a 60 metres dont l'orientation change a chaque vague, puis
chargent.

Ces vagues restent une addition de ma part, pas une donnee du jeu : la
cite ne compte que 273 points de defenseurs pour une barre qui en
demande 300. Si la correspondance des poids se revele fausse, elles
n'auront plus lieu d'etre.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-04 23:54:16 +02:00
BlaMacfly 82254cf627 Rivage brise : les neuf etapes ont enfin leurs criteres officiels
Suite du parcours joue de bout en bout avec l'exploitant.

ETAPE 6, LA BARRE RESTAIT A 0 %. Son arbre 42770 porte l'operateur 9,
SUM_CHILDREN_WEIGHT : la barre vaut 300 points et chaque enfant y
contribue selon son poids -- 44384 vaut 1, 53062 vaut 2, 53063 vaut 5,
53064 vaut 10. Le script n'envoyait aucun des quatre : il comptait dix
morts dans son coin et forcait le passage, laissant la barre morte.
Les demons ordinaires alimentent desormais le poids 2, les elites le
poids 5, et des vagues affluent pour que la barre puisse se remplir --
la zone ne compte pas assez de defenseurs pour ses 300 points.

LES CAGES DE LA LEGION ne comptaient pour rien : aucun critere ne les
mentionne, et elles n'avaient aucun script. Signale en jeu, puis
confirme par l'observation (« la barre bouge de 1 % »). Elles portent
le quatrieme poids, le seul qui restait libre. Les 39 exemplaires sont
rattaches a go_legion_cage.

ETAPE 7, TIRION se validait par une minuterie de douze secondes, sans
le joueur, et disparaissait au bout de vingt -- impossible a atteindre
meme en courant. Meme defaut que « Trouver Varian ». Il faut desormais
le rejoindre, il reste en place, et Krosus n'apparait qu'ensuite.

ETAPES 8 ET 9 cablees dans la foulee : 44669 a la mort de Krosus,
44826 quand Gul'dan est arrete. Plus aucune etape ne se valide par
forcage.

DOUBLONS DE PLACEMENT : neuf creatures de la 1460 et trente-huit de la
1666 occupaient une position strictement identique a une autre, au
centimetre pres. L'import n'est pas en cause -- la reference les porte
deja en double, guids 294825 et 294827 pour l'entree 92564. Ecart
assume avec elle, au benefice du rendu.

RESERVE : la correspondance des quatre poids de l'etape 6 reste une
deduction. La cite ne contient que deux categories d'ennemis la ou les
poids en supposent quatre. A verifier en jeu, chiffres en main.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-04 23:33:12 +02:00
BlaMacfly 191422c038 Rivage brise : rendre la VOIX aux personnages du scenario
SIGNALE EN JEU : « tous les PNJ de la zone sont totalement inexpressifs,
ca n a pas d ame », et « tout est muet meme s il y a du textuel ».

Nos repliques portaient un BroadcastTextId a ZERO. Le serveur envoyait
donc du texte brut, que le client affiche sans rien avoir a resoudre --
donc sans version localisee et SANS BANDE SON. Le client possede
pourtant les deux : c est pour cela que la video montre du francais
alors que notre base n en contient aucune traduction. Il ne lui manquait
que l identifiant.

34 repliques recuperees du creature_text de dufernst/LegionCore-7.3.5,
qui a conserve les Sound et BroadcastTextID d origine, pour dix
personnages : Varian, Voljin, Jaina, Sylvanas, Genn, Thrall, Baine,
Mekkatorque et Krosus. Le texte y est en russe, sans importance --
l identifiant prime. Celui porte ici est l anglais officiel tire de
notre propre broadcast_text, en repli et repere de lecture.

GROUPES DECALES DE +10 : nos repliques existantes aux groupes 0 et 1
sont conservees, le script les appelle par Talk(0) et Talk(1). Les
ecraser ferait dire a Varian « Pour l Alliance ! » au moment de mourir.

RESTE A FAIRE : le script n appelle encore aucune de ces lignes. Il
faut des cris de combat -- « Celui-la est a moi ! », « A la gorge ! » --
et une IA pour que les allies engagent les demons. Aucune des 156
entrees de cette carte n a le moindre AIName ni ScriptName.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-04 22:47:28 +02:00
BlaMacfly 5c8b82338e Coeur de Pierre : l'Eclat sismique d'Azil faisait tomber le serveur
Signale en jeu avec une reproduction exacte : « si on attend la phase
deux sans le frapper, le serveur plante ». Deux vidages memoire l'ont
confirmee, pile en main :

    #0  spell_seismic_shard::HandleScript(SpellEffIndex)
    #1  Spell::HandleEffects
    #2  Spell::DoSpellHitOnUnit
    ...
    #13 InstanceMap::Update

GetDynObject renvoie un pointeur NUL quand l'objet de visee n'existe pas
-- pas encore cree, ou deja expire. La ligne suivante le dereferencait
sans le moindre test :

    DynamicObject* dynamicObject = GetCaster()->GetDynObject(...);
    target->CastSpell(dynamicObject->GetPositionX(), ...);

Le plantage a lieu dans le fil de mise a jour de la carte, donc il
emporte le processus entier, pas seulement la session fautive.

GetCaster() et GetHitUnit() sont verifies au passage : rien ne garantit
leur presence au moment ou l'effet est traite, un lanceur mort entre le
lancement et l'impact suffit. Meme prudence sur le ExitVehicle du script
de changement de siege, juste au-dessus.

RESTE OUVERT, signale par le meme joueur et non traite ici : le deuxieme
boss du donjon se reinitialise des qu'on le deplace, et le bouclier du
dernier boss serait purement visuel, sans absorption.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-03 23:14:10 +02:00
BlaMacfly a95670ac0a Rivage brise : portage de l'Assaut 7.2 (scenario 1280, carte 1666)
La carte 1666 etait declaree mais entierement vide, et instance_template
y reclamait un script fantome. Les quetes 45102 « Begin the Assault » et
46734 « Assault on Broken Shore » etaient donc infranchissables : elles
relevent de ce scenario, et non de l'introduction 7.0 deja portee sur la
carte 1460.

PORTAGE, PAS TRANSCRIPTION. La source (dufernst/LegionCore-7.3.5, meme
lignee uwow) repose sur quatre extensions que nous n'avons pas :
onScenarionNextStep/getScenarionStep, CRITERIA_TYPE_SCRIPT_EVENT_2,
FunctionProcessor et une surcharge de GetClosestGraveYard. La
progression est donc inversee : au lieu d'etre rappele a chaque etape,
le script alimente les criteres officiels et le moteur avance seul --
la meme architecture que sur la carte 1460.

Les neuf criteres des huit etapes ont ete releves dans les DB2 du build
7.3.5.26972 (ScenarioStep, CriteriaTree, Criteria) et non recopies de la
source ; ils confirment ses identifiants d'asset. Sept sont de type 92
(SEND_EVENT_SCENARIO), un de type 73, un de type 68.

Six ecarts d'API traites, tous constates et non supposes :
InstanceScript(InstanceMap*), Conversation::CreateConversation (Player
n'a pas cette methode -- la source l'appelait sur une creature, cela
n'aurait pas compile), UNIT_NPC_FLAGS avec SetFlag64, DamageTaken a 2
arguments, OnSpellClick a 2, MovePath a 2.

NON PORTE : player_scripts_for_start_assault, qui sondait chaque joueur
a chaque tick pour lui imposer la quete 46730. Un donneur en base fait
le meme travail sans ce cout.

SQL joint :
- rattachement des 5 scripts a leurs 11 entrees, toutes verifiees
  exclusives a la carte 1666 ;
- les 87 points des 5 chemins scriptes. Ils vivaient dans
  waypoint_data_script, table absente de notre schema, d'ou leur oubli
  lors de l'extraction du 27/08. Le 11322708 est le vol d'arrivee :
  l'atteinte de son point 20 declenche l'etape 0, sans lui rien ne
  demarrait ;
- le donneur manquant de 45102, l'archimage Khadgar 116302, deja pose
  chez nous aux coordonnees de la reference mais jamais declare.

Les 593 creatures et 59 objets de la carte etaient generes depuis le
27/08 et n'avaient jamais ete appliques ; ils le sont desormais.

RESERVE : rien de tout ceci n'a ete verifie en jeu. Les credits de quete
116253 et 116279 sont en outre cables sur la fermeture des deux premiers
portails par deduction -- la quete parle de « First » et « Second Legion
Spire destroyed » -- et non sur une donnee.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-31 23:34:53 +02:00
BlaMacfly a4d245ecbe Commandes : .npc add perdait la phase du maitre de jeu
Les PNJ crees en jeu n'etaient visibles qu'en mode MJ. InheritPhaseShift
donnait bien la phase du joueur a la creature, mais SaveToDB n'ecrit que
GetDBPhase() -- la phase DECLAREE EN BASE, nulle pour une creature creee
a la volee. La commande detruit ensuite l'objet et le recree depuis la
ligne enregistree, donc sans phase. Dans une aire phasee, PhaseShift::
CanSee exigeant une intersection, la creature etait invisible a tout
joueur normal ; le mode MJ masquait le defaut, SetAlwaysVisible
court-circuitant le test de phase.

TrinityCore 3.3.5 transmettait la phase explicitement a Create et a
SaveToDB, via un GetPhaseMaskForSpawn qui ignorait volontairement l'etat
« MJ voit tout ». La reecriture du systeme de phases a perdu ce principe :
master a le meme defaut. On le restaure, en annoncant la phase retenue
puisqu'un joueur moderne peut en porter plusieurs alors qu'une ligne de
la table creature n'a qu'un champ.

SQL joint : phase 6666 posee sur l'aubergiste deja pose au port de
Hurlevent, et suppression de 18 options de dialogue de type 1 qui
doublonnaient une option fonctionnelle et se placaient au-dessus d'elle.
Les options porteuses de conditions sont preservees -- une premiere
version avait supprime a tort les options d'Halloween.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-31 22:21:31 +02:00
sindoring d7701b5b98 production setup 2026-08-31 21:32:14 +04:00
SylvaniaCore deploy 3a4c6c01dd Hyjal : parler a Jaina faisait tomber le serveur -- et faction 16 au Rivage brise
1) PLANTAGE DU SERVEUR, cause reelle de la coupure de cette nuit

Trace du vidage 3007513 :
  #0 Trinity::Assert(...)
  #1 npc_jaina_proudmoore::OnGossipHello(Player*, Creature*)
  #2 WorldSession::HandleGossipHelloOpcode

hyjal.cpp utilisait ENSURE_AI(hyjalAI, creature->AI()), qui ASSERTE. Or
GetAI() ne fabrique une hyjalAI que si GetHyjalAI() la trouve, donc
uniquement dans l instance du Mont Hyjal. Ailleurs la creature recoit une
IA quelconque et l assertion tue le process.

Declencheur : un exemplaire de Jaina (17772) se trouve sur la carte 0, a
Hurlevent (-8295, 1386), en plus de celui du Mont Hyjal. Lui parler
suffisait a planter le serveur -- faille exploitable par n importe quel
joueur, sans commande ni privilege.

Les 5 occurrences passent en dynamic_cast avec sortie propre.

J avais d abord conclu a une recursion en me fiant a la taille du vidage
(387 Mo contre 133). C ETAIT FAUX : cette taille reflete la memoire
allouee au moment du plantage, pas un debordement de pile. La trace, elle,
etait parfaitement lisible.

2) RIVAGE BRISE : factions demoniaques ramenees a 16

Etabli par TEST A/B, pas par raisonnement. Une seule entree basculee en
faction 16 (Molosse de l effroi gangrene, 90686), toutes choses egales
par ailleurs. Verdict en jeu : « les molosses sont maintenant
attaquables », les autres non.

La sonde SPAWNDBG confirme que seule la faction distingue les deux :
  Felstalker Dreadhound  faction=16    drapeaux=32768 drapeaux2=0  OK
  Felguard Legionnaire   faction=2780  drapeaux=32768 drapeaux2=0  bloque

Pourquoi 2780 echoue reste INEXPLIQUE : FactionTemplate.db2 lui donne
EnemyGroup=15 (ennemi de tous) et sa faction 1786 a ReputationIndex=-1,
donc aucune reputation n intervient. Sur le papier elle devrait etre
hostile. Le refus vient du client, qu aucune sonde serveur ne peut
observer. On retient donc la faction 16, demontree fonctionnelle dans ce
scenario meme -- ecart assume avec la donnee de reference.

101 entrees, 464 spawns. Effet secondaire bienvenu : les demons cessent
de s entretuer (Friend_0=14).

3) COMPTEUR : tout demon compte desormais

Signale : « les molosses sont attaquables mais ne comptent pas dans l
objectif ». OnUnitDeath ne reconnaissait que les cinq entrees invoquees
par le script. On s appuie desormais sur le type demon plutot que sur une
liste de 101 entrees qui vieillirait mal.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-31 10:20:45 +02:00
SylvaniaCore deploy 5408eae697 Rivage brise 1460 : UNIT_FLAG2_UNK5 rendait les demons inattaquables
Signale en jeu, nommement : Gangreseigneur Rakkan, Legionnaire
gangregarde, Molosse de l effroi gangrene. Et l observation decisive :
« les demons inattaquables se battent avec les demons attaquables ».

LA CAUSE EST DE MON FAIT. La transposition des modeles a importe
unit_flags2 sur 147 entrees. Ces creatures valaient 0 avant ; elles ont
recu 2097152, soit 0x200000 -- UNIT_FLAG2_UNK5.

CE DRAPEAU EST PARTICULIER : notre serveur l IGNORE totalement, aucune
de ses verifications ne le consulte. Le client, lui, l interprete et
refuse de designer la creature comme cible.

C est ce qui explique le symptome le plus deroutant de la serie : la
sonde posee dans _IsValidAttackTarget n a JAMAIS produit la moindre
ligne pour ces creatures. Le client refusait de lui-meme, sans jamais
interroger le serveur. L ABSENCE DE TRACE ETAIT L INFORMATION -- j ai
mis trois tours a la lire comme telle.

CORRELATION QUI TRANCHE :
  demons INVOQUES (attaquables) : unit_flags2 = 0
  demons STATIQUES (bloques)    : bit 0x200000 present
  67 entrees, 420 spawns.

Seul ce bit est retire, le reste de la colonne est preserve. Le serveur
ne s en sert pas : le retrait ne peut rien casser cote logique.

Egalement dans ce lot, deux sondes conservees le temps de la validation :
ATTDBG (recentree sur les factions 2780/1768) et SPAWNDBG (etat reel des
creatures a leur creation). Deux divergences d API relevees au passage :
getFaction() et getLevel(), en minuscule dans ce fork.

Retour arriere joint.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-30 22:51:16 +02:00
SylvaniaCore deploy 995122dc78 Rivage brise 1460 : les demons statiques etaient immunises aux joueurs
Signale en jeu : « les demons invoques c est ok mais pas les autres au
fond ». Les creatures invoquees par le script etaient frappables, les
placements statiques non.

LA CAUSE EST DE MON FAIT. La transposition des modeles d hier a importe
unit_flags sur 136 entrees. Parmi les valeurs reprises, 33536 et
537166592 contiennent le bit 256 -- UNIT_FLAG_IMMUNE_TO_PC. Dans le
coeur de reference un script retire vraisemblablement ce drapeau au bon
moment ; le notre ne gere aucun drapeau, les demons restaient donc
immunises en permanence.

Cela explique aussi pourquoi la sonde ATTDBG ne produisait plus rien : le
client refusait de lui-meme, sans jamais interroger le serveur. L absence
de trace etait l information.

PORTEE : uniquement les factions HOSTILES -- 2780 (30 entrees), 1768
(20 : Anetheron, Balnazzar, Brutallus...), 2878 (Krosus), 14 (Gul dan),
2877 (Lave gangrenee). Soit 53 entrees.

EPARGNES car l immunite y est legitime : factions 35, 2876, 2879, 1819 --
allies, pretres, montures, vaisseaux. 13 entrees conservees.

SIMPLIFICATION ASSUMEE : Krosus et Gul dan perdent aussi leur immunite,
alors qu une implementation fidele la retirerait au debut de leur etape.
Notre script ne gere aucun drapeau : la conserver rendrait les etapes 7
et 8 infranchissables. La progression reste pilotee par la machine a
etats du script.

Retour arriere joint.

A NOTER, non traite : les modeles de Varian (90713) et Jaina (90714)
sont ceux d anciennes versions. Le dump de reference ne stocke aucun
modele dans creature_template -- ses affichages viennent d ailleurs. Une
autre source sera necessaire. Cosmetique, non bloquant.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-30 22:22:13 +02:00
SylvaniaCore deploy 6219d00c06 Rivage brise 1460 : les modeles de creatures etaient des souches
Signale en jeu : « exemple lui n est pas attaquable », capture d un
.npc info montrant Felguard Legionnaire (109591) en Level: 1.

Nos creature_template de l epoque Legion sont des SOUCHES : sur les 152
entrees exclusives a cette carte, 141 etaient au niveau 1. La faction,
corrigee au tour precedent, n etait que la partie visible du trou.

Divergences relevees face au dump de reference :
  minlevel   150/152      unit_flags2  147/152
  maxlevel   145/152      unit_flags   136/152
  unit_class  62/152      speed_run     55/152
  AIName      32/152      speed_walk    12/152

151 entrees corrigees. Il ne reste que 6 souches : les entrees partagees
avec d autres cartes, volontairement ecartees comme pour les factions --
ce sont des declencheurs invisibles.

EXCLUS VOLONTAIREMENT du correctif, malgre leurs divergences :
  AIName      -- transposer pourrait defaire un comportement pose
                 sciemment chez nous.
  flags_extra -- porte des drapeaux que le coeur calcule lui-meme, dont
                 CREATURE_FLAG_EXTRA_DUNGEON_BOSS pose au chargement
                 depuis instance_encounters.

Verification prealable ecrite : un comparateur colonne par colonne
(chantiers/rivage_brise/outils/comparer_templates.py) a mesure les
divergences avant toute modification, plutot que de transposer en bloc.
La faction n y figurait plus, confirmant que le correctif precedent avait
bien pris et que l outil dit vrai.

Retour arriere joint, reconstruit depuis les valeurs d avant correction.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-28 16:06:07 +02:00
SylvaniaCore deploy 6c3804dde9 Rivage brise 1460 : les demons etaient hors de la phase du joueur
Signale en jeu : « les ennemis sont bien affiches en rouge mais mon
curseur ne m indique pas qu ils sont attaquables ; en revanche eux
peuvent m attaquer ».

scenario_broken_shore_intro::OnPlayerEnter place chaque joueur en phase
169 (PhasingHandler::AddPhase). Le script porte son propre avertissement,
ecrit par qui l a redige : « Toute invocation doit partager la phase des
joueurs, sinon elle est invisible/intangible : cible de quete
introuvable, vague intuable. » C est pourquoi FinalizeSummon ajoute la
phase 169 a tout ce qu il invoque.

Or les 757 placements importes etaient en phase 0. Le script n en
attendait AUCUN : il invoquait la totalite de ses acteurs. En important
le decor statique, on a introduit des creatures qui ne partagent pas la
phase du joueur -- visibles, mais intangibles.

VERIFIE avant de conclure : la reference donne bien PhaseId vide pour
les 757 lignes, la conversion en 0 etait donc fidele. Le decalage vient
de notre script, pas de la transposition.

CHOIX : aligner les placements sur la convention du script plutot que de
retirer le phasage. Retirer la phase 169 du joueur obligerait a la
retirer aussi de toutes les invocations -- bien plus de code touche pour
le meme resultat.

Les 101 objets sont inclus : les Fleches de la Detresse doivent etre
actionnables, sans quoi le critere des 3 fleches reste bloque.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-28 15:58:24 +02:00
SylvaniaCore deploy 483b3c02bc Rivage brise 1460 : les demons etaient flagues en allies
Signale en jeu, capture a l appui : « ce sont bien des ennemis mais
flagues en allie » -- plaques de nom vertes sur les Legionnaires
gangregarde.

Sur les 156 entrees placees, 729 spawns sur 757 portaient la faction 35,
amicale envers tous. Comparaison avec creature_template du dump de
reference : 135 entrees divergeaient. Ce trou est ANTERIEUR a l import
des placements, qui ne touche pas creature_template -- c est une valeur
par defaut posee sur ces PNJ de Legion dans notre base.

Repartition retablie :
  2780  441 creatures  les demons de la Legion (hostiles)
  2879  105            les PNJ Alliance
  2876   67            les PNJ Horde
  1768   23            les demons nommes (Anetheron, Balnazzar, Brutallus)
    35   74            ce qui doit rester neutre : canons, vehicules,
                       navires, declencheurs invisibles

PRUDENCE OBSERVEE : creature_template.faction agit PARTOUT, pas seulement
sur la carte visee. Les 4 entrees possedant un spawn hors de la carte
1460 ont donc ete EXCLUES du correctif -- ce sont des declencheurs
invisibles (General Purpose Bunny) et un matelot, pour lesquels la
faction 35 est correcte. Portee reelle : 135 entrees exclusives a 1460.

Fichier de retour arriere joint (chantiers/rivage_brise/), reconstruit
depuis les valeurs en place avant modification.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-28 15:19:13 +02:00
SylvaniaCore deploy 42427a8a72 Rivage brise 1460 : rebrancher les vrais compteurs de l etape 1
Signale en jeu : « la phase 1 ou il fallait tuer 33 demons ainsi que
d autres objectifs a ete skip et je suis passe en phase 3 direct », puis
« les objectifs ne se remplissent jamais ».

DEUX COMPTEURS VIVAIENT EN PARALLELE, et ne disaient pas la meme chose.

Le client affichait les criteres officiels de l arbre 42935 (« Broken
Shore - Stage 1 », operateur ALL) du build 7.3.5.26972 :
    43010  Demons slain             33   critere 27653
    46549  Fel Lords slain           3   critere 29377
    46548  Spires of Woe destroyed   3   critere 27619
Tous trois de type CRITERIA_TYPE_SEND_EVENT_SCENARIO (92) : ils ne se
remplissent PAS en tuant, mais quand le script emet l evenement
correspondant. Le script ne l emettait jamais -- d ou le 0/33 fige.

En parallele, il tenait sa propre comptabilite et cloturait l etape a
KILLS_BEACH = 12, un chiffre invente. D ou l impression de saut : a 12
demons il invoquait Arganoth avec SetInCombatWithZone(), lequel mourait
aussitot et faisait franchir une seconde etape.

CORRECTIF -- on ne touche PAS aux objectifs, qui sont officiels et de
toute facon dans les donnees du client. On supprime le seuil invente et
on emet les vrais evenements :
  - chaque demon tue emet 44095 ;
  - chaque Seigneur gangrebois emet 52643 (les treize entrees placees
    sur la carte sont enumerees explicitement, le nom n etant pas une
    donnee stable) ;
  - chaque Fleche actionnee emet 44077 ;
  - l etape ne s acheve que si les TROIS seuils officiels sont atteints
    (33 / 3 / 3), conformement a l operateur ALL de l arbre.

LES FLECHES sont des objets de type 10 : ACTIONNES, pas detruits. Ni
OnGameObjectCreate ni OnGameObjectRemove ne rapportent cette
utilisation. Le seul accrochage est GameObjectScript::OnGossipHello, que
GameObject::Use appelle avant tout traitement specifique
(GameObject.cpp:1379). D ou la classe go_spire_of_woe -- ET son
rattachement en base, sans lequel elle n aurait jamais ete invoquee.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-28 13:05:22 +02:00
SylvaniaCore deploy c8f1d570e1 Rivage brise : placements des cartes 1460 et 1666, generateur unifie
NON APPLIQUES au serveur. Verses pour relecture.

DECOUVERTE QUI RECADRE LE CHANTIER
Il y a DEUX Rivages brises, et je preparais le second en premier :
  carte 1460 -- le lancement de Legion (Voljin, Varian, la defaite),
               c est le contenu de la video fournie ;
  carte 1666 -- l assaut de la 7.2 (Kalgorath, Arganoth, Mephistroth).

Pour la 1460, NOTRE SCRIPT EXISTE DEJA : scenario_broken_shore_intro.cpp,
464 lignes, correctement rattache -- instance_template reclame
scenario_broken_shore_intro et c est exactement le nom sous lequel il
s enregistre (RegisterInstanceScript, map 1460). Son scenario est aussi
deja declare (786). Il ne lui manquait QUE les placements. Aucun portage
C++ n est necessaire pour cette carte.

VERIFICATION CROISEE faite avant de generer : sur les 17 entrees que le
script attend, 10 sont placees dans la reference (Voljin, Sylvanas,
Baine, Thrall, Varian, Jaina, Mekkatorque, Genn, Krosus, Arganoth) et
les 7 autres sont INVOQUEES par le script lui-meme (Khadgar l.335,
ancres l.370-371, Tirion l.380, Guldan l.398, troupes via TroopEntry,
credit de fin l.431). La repartition est donc coherente.

CONTENU
  carte 1460 : 757 creatures, 101 objets, 84 chemins (526 points)
  carte 1666 : 593 creatures, 59 objets, 180 chemins (1495 points)
  Toutes les creatures mobiles ont leur chemin, aucune orpheline.

BUG RATTRAPE A LA VALIDATION
Une premiere version de l outil, obtenue en substituant mecaniquement le
numero de carte, produisait pour la 1460 un fichier dont les DELETE
visaient encore la 1666 : il aurait vide la mauvaise carte et laisse
l autre intacte. Le generateur est reecrit, le numero de carte ne vit
plus qu a un seul endroit, et la difficulte est desormais DEDUITE du
spawnMask (verifiee puissance de 2, uniforme) au lieu d etre codee.

VALIDATION en base jetable pour les deux fichiers : import reussi,
comptages exacts, zero creature hors carte, zero mauvaise difficulte,
zero mobile sans chemin, zero collision de GUID avec la base reelle.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-27 23:50:14 +02:00
SylvaniaCore deploy 1b1eb863e2 Rivage brise : declaration du scenario pour la carte 1666
Sans cette ligne la carte n a aucun scenario attache : aucun suivi
d objectifs ne s affiche et aucune progression n est enregistree. Meme
manque que celui constate sur les donjons de Pandarie.

VALEURS VERIFIEES, pas supposees
  Scenario 1280 : releve dans scenario_data du dump de reference, puis
  confirme dans Scenario.db2 du build 7.3.5.26972 --
  « The Assault on Broken Shore », type 4.

  Difficulte 12 : MapDifficulty.db2 ne declare qu une seule difficulte
  pour la carte 1666, la 12, pour 5 joueurs. Difficulty.db2 donne pour
  la 12 « Normal Scenario », type d instance 5.

  RECOUPEMENT INDEPENDANT : les 593 placements extraits pour cette carte
  portent tous spawnMask = 4096, soit 2^12 -- la meme difficulte. Deux
  sources distinctes concordent.

  Team 0 cote reference = les deux camps, d ou scenario_A = scenario_H,
  ce que confirme la video qui montre le meme deroule des deux cotes.

Le scenario compte HUIT etapes distinctes (Into the Fray, Vanguard of
the Assault, Might of the Legion, Rifts of Chaos, The Doomguard s
Command, Gateway to Ruin, Pillar of Fire, Mephistroth), chacune avec son
propre arbre de criteres -- contrairement a la Brasserie qui n en avait
qu une a trois criteres. Le correctif de scenario deploye aujourd hui se
comportera donc correctement ici.

Applique. Table lue au demarrage : effet au prochain redemarrage.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-27 23:41:38 +02:00
SylvaniaCore deploy bab69fab2d Rivage brise : SQL de placement genere (593 creatures, 59 objets, 180 chemins)
NON APPLIQUE au serveur. Le fichier est verse pour relecture.

Transpose depuis le dump world de dufernst/LegionCore-7.3.5 vers notre
schema. Le generateur est pilote par les NOMS de colonnes et s arrete
plutot que de produire un decalage silencieux si un schema bouge.

CONTENU
  593 creatures, 59 objets, 180 chemins (1495 points). Les 180 creatures
  a MovementType=2 ont TOUTES leur chemin : aucune orpheline.

DECISIONS etablies sur donnees
  spawnMask 4096 = 2^12 -> spawnDifficulties '12', la difficulte 12 etant
  « Normal Scenario » d apres Difficulty.db2 du build 7.3.5.26972.
  GUID renumerotes a partir de 290100000 et 210200000, au-dessus de nos
  maxima 290000114 et 210120986.
  PhaseId : chaine vide cote reference -> 0 chez nous (colonne entiere).

VALIDATION faite dans une base jetable, pas sur dc_world :
  import reussi, comptages exacts, et cinq controles a zero -- aucune
  creature hors carte, aucune difficulte erronee, aucune mobile sans
  chemin, aucun chemin orphelin, aucune position nulle. Aucune collision
  de GUID avec la base reelle. La carte 1666 y est actuellement vide,
  donc le DELETE d en-tete n efface rien.

Repartition en altitude coherente : 454 creatures au sol, 64 au-dessus de
600 (aeronefs presumes, a confirmer en jeu).

ABANDONNE faute d equivalent : npcflag2, AiID, MovementID, MeleeID,
isActive, skipClone, personal_size, isTeemingSpawn. 12 creatures
portaient AiID=7424 : leur comportement est perdu et reste a refaire.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-27 23:39:09 +02:00
SylvaniaCore deploy 80b76d3bd1 Pandarie : aucune rencontre de boss n etait declaree
Signale en jeu : « je n ai plus les objectifs de boss a battre affiches,
ce qui laisse penser que le donjon est considere comme fini au 1er
boss ».

instance_encounters associe une rencontre officielle (DungeonEncounter)
a la creature qui la valide. Sans ces lignes le coeur n a rien a
annoncer au client : aucun objectif ne s affiche et aucune progression
n est enregistree. Le script d instance declarait pourtant bien ses
trois rencontres (MAX_ENCOUNTER 3) -- c est la donnee qui manquait, pas
le code.

Verification faite, AUCUN donjon de Pandarie n avait ses rencontres :
Temple du Serpent de jade, Brasserie, Passage des Voleurs de mort,
Palais de Mogu shan, Porte du Couchant, Fosse aux serpents. La table
contient 389 rencontres pour les extensions precedentes : l oubli est
circonscrit a Pandarie.

Traites ici les deux donjons debogues recemment (7 rencontres).
Identifiants releves dans DungeonEncounter.db2 du build 7.3.5.26972
filtre par MapID, et LFGDungeons.db2 en mode normal pour le dernier
boss de chaque donjon.

Table lue au demarrage uniquement : necessite un redemarrage.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-25 22:44:49 +02:00
SylvaniaCore deploy b182593051 Distribution des bases : script de release, et les 2 tables du Siege
Le depot fournissait deja des schemas auth et characters vierges, mais pas les
bases de contenu : personne ne pouvait monter une copie conforme du royaume.
Elles ne peuvent pas vivre dans l historique git (dc_world pese 880 Mo, ~79 Mo
gzippe, et GitHub refuse au-dela de 100 Mo par fichier) : le canal correct est
l asset de Release, celui qu utilise deja l amont.

sylvania/scripts/db-release-github.sh dumpe dc_world et dc_hotfixes en clair,
calcule les empreintes et depose le tout en Release BROUILLON, a relire avant
publication. Deux precautions apres verification des dumps reels :

- MariaDB 11.4 ecrit ses tables en utf8mb4_uca1400_ai_ci, collation inconnue de
  MySQL 8 : un import s y arretait sur "Unknown collation". Le script la
  reecrit en utf8mb4_unicode_ci, reconnue des deux moteurs et de meme
  semantique, et refuse de produire un dump ou il en resterait.
- Les tables de travail bak_* et tmp_* laissees par d anciennes maintenances
  (7 tables) sont exclues : ce n est pas du contenu.

Test de restauration complet passe : 248 tables, updates a 332 lignes (le core
ne rejouera donc pas sql/updates/world), 110 483 creature_template et 29 013
quest_template, aucune erreur.

Par ailleurs capital_siege_state et capital_siege_history n existaient que dans
sql/sylvania/capital_siege.sql, hors du mecanisme de mise a jour : une
installation neuve avait un schema characters incomplet et le module ecrivait
dans des tables absentes. Le patch est repris tel quel en fichier d update.

Enfin, les prerequis annoncaient MySQL 8.0 alors que le serveur tourne sous
MariaDB 11.4.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-25 22:28:22 +02:00
SylvaniaCore deploy 0a105df163 Brasserie : le script du tonneau d Ook-Ook etait accroche au mauvais sort
Le coeur le signalait a chaque demarrage : les accroches OnEffectApply
et OnEffectRemove de spell_ook_ook_barrel_ride ne correspondaient pas
aux donnees du sort 122169 et n etaient donc jamais executees.

Le script est un AuraScript qui attend SPELL_AURA_CONTROL_VEHICLE (236)
a l index 0. Or 122169 n a qu un seul effet et ce n est pas une aura :
Effect 140 (SPELL_EFFECT_FORCE_CAST), EffectTriggerSpell 122163. Il ne
fait que forcer la cible a lancer 122163, et c est 122163 qui porte
l aura de vehicule (index 0, Effect 6, EffectAura 236).

Le script etait donc accroche au maillon declencheur au lieu du sort qui
porte l aura -- structurellement, ses accroches ne pouvaient jamais
s attacher. Donnees relevees dans les DB2 du build 7.3.5.26972.

La semantique du script confirme la cible : dans OnApply, GetTarget()
est le tonneau et GetCaster() le joueur qui le chevauche.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-25 12:13:57 +02:00
SylvaniaCore deploy cde796b2da Anneau du sang : Mogor ne creditait pas la quete 9977
Signale en jeu : « le dernier boss ne rez pas », puis « elle me dit
qu'elle est validee mais il me dit qu'elle n'est pas finie ».

Ni un probleme de reapparition ni un objectif manquant. Les six quetes
de la chaine portent SpecialFlags = 2 (EXPLORATION_OR_EVENT) : elles
n'ont volontairement aucun objectif et ne se terminent que si un script
appelle l'evenement de quete. D'ou le symptome exact : le client, sans
objectif a remplir, affiche la quete comme terminee ; le serveur attend
un signal qui n'arrive jamais.

Les cinq autres adversaires portent tous le meme motif -- evenement 6
(a la mort) vers action 15 (credit de quete) avec cible 16 (groupe de
l'invocateur) : 18398/9962, 18399/9967, 18400/9970, 18401/9972,
18402/9973. Mogor etait le seul a ne pas l'avoir : sa liste d'actions
de mort (1806901) se contente de le ressusciter et de lui faire dire
une replique.

Ligne calquee a l'identique sur le modele (event_flags 513, cible 16).
Aucune ligne ajoutee dans quest_objectives : ce serait contraire au
drapeau et incoherent avec le reste de la chaine.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-24 23:50:36 +02:00
SylvaniaCore deploy 39171026a7 Sagesse de Mari : « Lessiver » frappait aussi dans le dos du boss
Signalé en jeu : le jet d'eau de la phase 2 infligeait des dégâts aux
joueurs placés derrière le boss, « comme s'il y avait des dégâts de zone
autour ».

Le sort est en réalité une chaîne de trois. 106329 canalise — et son
effet 1 est un « script côté serveur », c'est-à-dire une logique Blizzard
jamais distribuée avec les données du client. 106331 est l'aura posée sur
le boss, qui déclenche 106334 toutes les 250 ms. C'est 106334 qui blesse :
école Givre, recul 200, rayon 60 m, drapeau « ignore la ligne de vue ».

Toute la forme du jet tenait donc à une seule valeur, et à une entrée DB2
facultative :

    ConeAngle = _target ? _target->ConeDegrees : 0.f;

Le mode de contrôle associé au ciblage 110, TARGET_CHECK_ENTRY, ne filtre
par ailleurs — sans `conditions` — ni l'hostilité ni la position.

Valeurs officielles relevées dans les DB2 du build 7.3.5.26972 :
    SpellTargetRestrictions ligne 7514 : ConeDegrees = 12
    SpellRadius             ligne 48   : Radius      = 60
soit un cône frontal de 12° sur 60 mètres.

Le script `spell_wise_mari_wash_away` réimpose ces 12° en dur plutôt que
de dépendre d'une donnée invérifiable côté serveur (la table spell_effect
de dc_hotfixes est vide, ces données vivent dans les fichiers DB2), et
rétablit le contrôle d'hostilité laissé de côté par TARGET_CHECK_ENTRY.

Le boss pivote de PI/48 toutes les 300 ms, soit 3,75° : avec un jet de
12°, un joueur immobile est balayé environ une seconde par tour de salle.
C'est le comportement d'origine.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-24 22:44:32 +02:00
SylvaniaCore deploy 69b2924369 Sagesse de Mari : elle navait aucun dialogue, ni texte ni voix
Signale en jeu. Verifie : creature_text ne contenait AUCUNE ligne pour
lentree 56448, alors que son script appelle Talk() sept fois. Chaque
appel ne faisait rien.

Les identifiants de sons viennent de la fiche Wowhead du PNJ (section
sounds) : VO_TJS_MARI_INTRO_01, _AGGRO_01, _CALLWATER_SPELL_01/03/04,
_PHASE2_START_01, _SLAY_01/02, _DEATHEVENT_01/02/03. Chacun a ete
retrouve dans broadcast_text par son SoundEntriesID1, ce qui donne
lidentifiant de texte officiel.

Et les traductions francaises existaient deja toutes dans
broadcast_text_locale : « Vous osez deranger ces eaux ? Vous serez
submerges ! », « Les eaux... memportent... ». Rien nest traduit a la
main. BroadcastTextId est renseigne en plus du texte, pour que chaque
joueur entende la voix et lise la replique dans SA langue.

11 repliques sur 6 groupes, avec les variantes aleatoires dorigine :
trois pour lappel de leau, trois pour la mort, deux pour la victime.

Le groupe 2 reste VIDE volontairement : le script appelle
Talk(TEXT_BOSS_EMOTE_AGGRO) mais aucun texte demote nexiste pour ce
boss, ni en base ni chez Wowhead. Plutot quinventer une phrase, on
laisse la lacune visible — le serveur la signalera une fois par pull.
2026-08-24 12:39:44 +02:00
SylvaniaCore deploy d599d06cac Nettoyage : 1 648 lignes de butin pointant vers des objets inexistants
Releve en verifiant que mes propres ajouts de butin ne produisaient aucun
refus au demarrage. Ils nen produisaient aucun — mais 19 entrees
preexistantes en produisaient 1 648.

Toutes appartiennent a Scholomance : Lilian Voss, Maitre-tenebre
Gandling, Rattlegore, Jandice Barov, Docteur Theolen Krastinov et le menu
fretin. Leur butin a ete importe depuis un releve moderne sans filtrer
les epoques — exactement lerreur evitee sur les lots de Pandarie. On y
trouve des objets de la plage 210000-224408, cest-a-dire le Legion Remix
de 2025. Certaines entrees portent jusqua 732 lignes dont 120
inexistantes.

Quatre autres references cassees au passage : Jaggen-Ra vers 140022,
Nithogg vers 133755, et surtout Coeur de la Montagne et Gruul qui
pointent vers lobjet numero 1.

Le serveur les ignorait deja au chargement, donc rien ne change en jeu :
on supprime 1 648 lignes derreur a chaque demarrage, et autant de bruit
qui masquait de vrais problemes.

Les paires supprimees sont exactement celles refusees par le serveur,
relevees dans son propre journal. Les 5 143 lignes restantes au-dessus de
150000 sont toutes dans la plage 150000-159999, fin de gamme Legion,
valide pour ce client — le serveur ne sen plaint pas et elles sont
conservees.
2026-08-24 01:30:12 +02:00
SylvaniaCore deploy df122a27d4 Butin des boss dinstance restants : raids Pandarie, Monastere ecarlate, Draenor
Troisieme volet du chantier ouvert par le signalement de « le baltring ».
23 boss servis, 440 lignes. Les boss dinstance avec butin passent de 39
a 76 sur 93.

Meme methode et meme filtrage que les lots precedents. Deux objets de
Marche-temps retires a la main parce quils tombaient sur des boss
depoques bien anterieures : 132565 chez Roogug (contenu classique) et
132549 chez le Commandant Durand.

Deux entrees volontairement incompletes, signalees dans le fichier pour
ne pas les croire reparees : Elegon na que deux objets a moins de 1 %
chez Wowhead, son butin principal de raid ny figure pas ; Valithria
Revemarcheuse na quun seul objet a 3,96 %.

Restent 17 boss sans aucune donnee. Pour plusieurs cest normal, leur
butin est porte par un autre boss de la rencontre. Pour les autres il
faudra une autre source.
2026-08-24 01:21:08 +02:00
SylvaniaCore deploy 958db7c3f4 Donjons de Pandarie : le menu fretin ne lachait rien non plus
Second volet du signalement de « le baltring ». Apres les 14 boss, 36
creatures de trash recoivent leur butin, 216 lignes.

Seuil a 1 %, et cest un choix assume. Les pages Wowhead de ces creatures
listent jusqua 250 objets, dont une longue traine de verts de zone
(plages 82xxx et 90xxx) a 0,05 % chacun. Les encoder aurait produit plus
de 20 000 lignes illisibles ; sur un vrai serveur ces verts passent par
reference_loot_template. On garde le butin principal, lEbauche
dharmonie 89112 presente partout, les jetons 81xxx et 88567 : 2 a 10
lignes utiles par creature au lieu de 250.

Meme filtrage que pour les boss : objets < 110000, plage authentique
Mists of Pandaria.

Decouverte : lentree 56439 sort 18 pieces dequipement, un butin de boss.
Cest le Sha du doute, boss final du Temple du Serpent de jade, que notre
base ne classe pas au rang boss — do son absence du lot precedent.
Dautres boss sont peut-etre mal classes de la meme facon, a verifier.
2026-08-24 01:14:02 +02:00
SylvaniaCore deploy 1b54f31a7c Donjons de Pandarie : les boss ne lachaient rien
Signale par « le baltring » sur Discord. Verifie : les 18 boss des
donjons de Pandarie avaient tous lootid = 0. A lechelle du serveur, 54
des 93 boss dinstance sont dans ce cas.

14 boss recoivent leur table officielle, 151 lignes au total, relevees
sur les pages Wowhead (rendues en JavaScript : ni curl ni un export de
page ne les voient, il faut un navigateur).

Filtrage assume. Wowhead agrege les releves de toutes les epoques : 67
objets ecartes, dont les identifiants >= 210000 du Legion Remix 2025 —
le journal confirme dailleurs que le client ne les connait pas — et les
141689 / 143xxx / 144xxx de Marche-temps, obtenus a 110 en Legion et sans
aucun sens pour un groupe de niveau 90 en donjon normal. Seule la plage
Mists of Pandaria est conservee.

Quatre boss restent sans butin faute de donnee exploitable : 56843
Pisteur du savoir Marchepierre, et le conseil 61442/61444/61445 du
Palais Mogushan dont le butin est porte par Gekkan — coherent pour les
trois derniers, a elucider pour Marchepierre.

Redemarrage necessaire : le lootid est lu dans le modele au chargement.
2026-08-24 00:58:06 +02:00
SylvaniaCore deploy af6b59eb82 Khadgar 86563 : un ScriptName fantome en cachait un vrai
Le demarrage signalait que npc_archmage_khadgar_86563 existe dans le code
sans quaucune entree ne le reclame, tandis que 86563 declarait
npc_khadgar_dalaran qui lui nexiste nulle part. Deux defauts symetriques
qui sannulent.

Ce script gere la quete 41220 « Direction Azsuna », que 86563 donne deja :
au choix de dialogue il lance le sort de taxi de la faction du joueur, qui
accorde le credit et envoie le vol. Sans rattachement, le dialogue ne
faisait rien.

Sans effet sur le SmartAI : le script ne surcharge pas GetAI, donc
FactorySelector retombe sur lAIName et la regle de credit de la campagne
du Declin de la Legion reste active.
2026-08-23 17:31:13 +02:00
SylvaniaCore deploy 7d42b9b501 Rivage brise : la campagne du Declin de la Legion ne demarrait pas
46730 « Les armees du Declin de la Legion » et 46734 « Lassaut du rivage
Brise » navaient ni donneur ni recepteur, et leur objectif commun (credit
120215, rencontrer puis parler a Khadgar) navait aucune source. La chaine
etait inaccessible de bout en bout.

Lentree 120215 nest posee nulle part. Plutot quajouter un Khadgar de plus
a Dalaran, la chaine va a celui qui est deja au bon endroit. Le choix
entre les trois Khadgar est tranche par le voisinage : 86563 a
Haut-seigneur Saurfang a 3,7 m, la Table de commandement a 6,9 m et
Danath Trollbane a 10,9 m — cest le conseil de guerre du Declin de la
Legion.

Son SmartAI fonctionne bien malgre son ScriptName : npc_khadgar_dalaran
nexiste nulle part dans le core, et FactorySelector retombe alors sur
lAIName. (42 ScriptName du serveur sont dans ce cas, a auditer.)

Reste bloque, hors de portee dun correctif de donnees : lobjectif 0 de
46734 est un arbre de criteres (58013) satisfait par le scenario dassaut
de la carte 1666, dont le script declare nexiste pas non plus et dont la
carte est vide. 46730 devient terminable, 46734 non.

45102 « Lancer lassaut » reste egalement bloquee : ses objectifs visent
Lord Kalgorath et deux Fleches du Malheur, dont aucune position nexiste
ni en base, ni dans les captures LegionCore. Rien a en tirer sans
inventer.
2026-08-23 17:26:09 +02:00