Commit Graph

209 Commits

Author SHA1 Message Date
SylvaniaCore deploy 29038ec486 sylvania/README : remettre les notes internes en accord avec le serveur
Le document affirmait "PlayerBots : DESACTIVES - serveur blizzlike sans bots"
alors que trois modules du royaume en pilotent : BG BotFill (pbotbg = 1),
Mercenaires (pbotmerc = 1) et le Siege des Capitales (livre, siege_enable = 0
pour l instant). Ce qui est coupe, c est le peuplement automatique herite de
l amont (pbot = 0, pbotall = 0), pas le systeme lui-meme : World.cpp initialise
le gestionnaire de bots des que pbotbg OU pbotall vaut 1. La confusion pouvait
conduire un contributeur a croire tout ce code mort.

Le reste etait date dans les memes proportions : une liste de quatre "correctifs
a commits dedies" pour plus de 200 commits de divergence, et rien sur les
modules ni sur la vraie base moteur (MariaDB 11.4, bases dc_*). Les valeurs de
configuration sont desormais relevees du worldserver.conf en production, avec
l effet de chaque cle.

Ajoute aussi : la mise en garde sur sql/sylvania (le dossier n a pas une base
cible unique, capital_siege.sql ecrit dans characters et non dans world), et la
description de db-release-github.sh.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-25 22:35:42 +02:00
SylvaniaCore deploy e657f4fb96 Brasserie : Ook-Ook ne descendait jamais, tonneaux encastres, barre decalee
Trois defauts distincts, tous confirmes par la sonde OOKDBG et par les
donnees de spawn.

1. OOK-OOK NE VENAIT PAS DANS L ARENE
La sonde montre que le chemin scripte fonctionne : « SEUIL ATTEINT »,
« Ook-Ook trouve, appel DoAction(0) », puis StartIntro. Le defaut etait
en aval, et double.
 a) L appel passait CINQ arguments -- MoveJump(x, y, z, 25.0f, 25.0f) --
    a une surcharge (x, y, z, o, speedXY, speedZ). Le premier 25.0f
    atterrissait sur l ORIENTATION. On passe par la surcharge prenant
    une Position.
 b) Il passait en reaction AGRESSIVE juste avant de sauter. Les joueurs
    sont 16 m plus bas, donc a portee : il acquerait une cible et le
    mouvement de poursuite ecrasait le saut. N ayant aucun chemin pour
    descendre, il restait plante sur son perchoir -- ce qui explique
    aussi qu il ait ete attaquable trop tot. Il reste passif pendant le
    saut et devient agressif a l atterrissage (MovementInform, en
    EFFECT_MOTION_TYPE, que le filtre existant ecartait).
Le domicile est fixe avant le saut, sinon l evade le ramene en haut.

2. TONNEAUX ENCASTRES DANS LE DECOR (capture a l appui)
DoCastBarrel figeait l altitude a 146.79, soit le sol de l arene
(ookJumpPos = 146.92). Or les Hurleurs se tiennent entre 155,6 et 161,5 :
le tonneau etait depose 9 a 15 m SOUS son lanceur, a la verticale du
balcon mais a l altitude du plancher. On interroge desormais le sol reel
sous le point vise, et le tonneau suit le sol pendant qu il roule.

3. BARRE DE BANANES BLOQUEE A 39
Le test portait sur la valeur APRES incrementation (« + 1 < 40 ») : la
barre n atteignait jamais 40/40. Signale comme « Ook-Ook apparait avant
40/40 » -- il apparaissait au bon moment, c est l affichage qui etait en
retard d une unite. Le compteur d instance, lui, etait monte a 94.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-25 22:28:23 +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 6fac9ded3e README : section d installation de la base de donnees
L etape 3 se contentait de dire d importer les structures SQL de sql/base,
ce qui envoie droit dans le mur : les bases world et hotfixes n y sont pas,
et sql/base/dev ne contient que des tables vides. Un contributeur s est
retrouve bloque sur l ecran de chargement apres avoir importe ces structures.

La nouvelle section indique ou telecharger la base amont (release DB735.02
de DestinyCore), l ordre d import, le reglage Updates.EnableDatabases = 31
qui laisse le core appliquer sql/updates tout seul, et le sort de
sql/sylvania. Elle documente aussi les deux messages de console
(ResourceService.GetContentHandle et CMSG_GET_ACCOUNT_CHARACTER_LIST) qui
sont normaux sur toute la lignee et ne sont pas des pannes.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-25 16:29:54 +02:00
SylvaniaCore deploy 8e9b65291f Brasserie : roulement des tonneaux, et sonde sur le reveil d Ook-Ook
Signale en jeu : « les tonneaux sont completement bugges, ils se
deplacent bizarrement ».

Deux defauts certains dans npc_barrel :

1. Le trajet etait reinitialise en plein vol. Move() relancait un
   MovePoint vers un point a 5 m devant TOUTES LES 300 ms, alors que le
   tonneau avance a 0,85 de vitesse (environ 5,95 m/s) : parcourir ces
   5 m lui demande 840 ms. Le trajet etait donc ecrase au tiers, quatre
   fois par segment. Cote client chaque reinitialisation est une rupture
   de trajectoire, d ou le roulement saccade. Le deplacement est
   desormais relance A L ARRIVEE via MovementInform, par segments de
   20 m.

2. L orientation de depart n etait jamais fixee. Le tonneau est invoque
   par un sort a 5-10 m devant le Hurleur, mais rien ne lui donnait de
   cap propre. Il part maintenant dans la direction du lancer.

Arbitrage assume : la generation de chemin de MovePoint est CONSERVEE.
Un tonneau devrait rouler droit et la couper serait plus juste sur le
papier, mais c est elle qui le maintient sur le sol praticable -- sans
elle il traverserait les murs. Sur sol degage le chemin est de toute
facon quasi rectiligne.

Sonde OOKDBG ajoutee (4 points) : Ook-Ook se reveille avant le seuil de
40 hozens alors qu InitializeAI le pose en NON_ATTACKABLE et en reaction
passive, et que le chemin scripte (SEUIL ATTEINT) n apparait jamais dans
les traces. Pistes deja ecartees : les evenements 2 et 3 de l instance
ne le concernent pas, et EVENT_INTROCHECK est programme mais traite
nulle part -- evenement mort.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-25 12:21:14 +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 8200eb3961 Serpent de jade : degats de l eau proportionnels a l effectif, sondes retirees
Le sort 106778 inflige 950 points fixes (EffectBasePoints, DB2 du build
7.3.5.26972 -- valeur confirmee par la sonde : exactement 950 par tic,
sans mitigation). A quatre tics par seconde cela fait 3800 par seconde,
un chiffre calibre pour cinq joueurs.

Or ce sont des degats BRUTS : ni l armure ni les statistiques ne les
reduisent, donc Solocraft n y peut rien (verifie, il s applique bien :
+400 % de statistiques, 61 000 PV au lieu de 12 299). Un joueur seul
encaissait la charge prevue pour cinq.

La valeur est desormais multipliee par l effectif present et divisee par
les cinq joueurs pour lesquels le contenu est calibre -- le meme rapport
que celui de Solocraft. Un joueur seul prend un cinquieme. Les maitres
de jeu ne comptent pas. La valeur de base est relue dans le sort plutot
que recopiee.

La cartographie du sol par la sonde (411 releves) a confirme que le
combat est jouable tel quel : bassin central jusqu a 5 m, ANNEAU SEC de
5 a 8 m -- le « inner most circle of dry zone » de la consigne
officielle --, rigole de 8 a 10 m, dallage sec au-dela. Le corps a corps
se fait depuis l anneau interieur.

Sondes TJSWATER et TJSDBG retirees. Celles de la Brasserie (SSBDBG)
restent en place, le blocage d Ook-Ook n est toujours pas elucide.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-25 12:01:25 +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 b03d31d161 Sagesse de Mari : l'eau brûlait partout et rendait le combat infaisable
Signalé en jeu par deux joueurs. Une sonde posée dans la boucle de dégâts
a montré que le joueur n'occupe que deux altitudes dans la salle :
174,698 sur la coursive sèche (103 relevés sur 124) et 174,157 dans la
cuvette centrale (12 relevés), à 3,1-4,5 m du centre — c'est-à-dire au
corps à corps.

Toute la cuvette infligeait 950 points toutes les 250 ms, soit 3 800 par
seconde, dès l'entrée en combat et sans aucune condition. Or la Sagesse
de Mari se tient dedans (174,24) : l'approcher revenait à se suicider.
Solocraft n'y peut rien, ces dégâts ignorent les statistiques — vérifié,
il s'applique correctement (+400 % de statistiques, 61 000 PV).

La sonde a aussi écarté deux fausses pistes : les dégâts ne venaient pas
de « Lessiver » (68 des 70 relevés portaient le sort 106778, lancé par le
joueur sur lui-même à zéro mètre), et les bandes d'altitude ne sont pas
mal calibrées — elles distinguent correctement la cuvette de la coursive.

CE QUE FAIT LE JEU OFFICIEL
L'infobulle du vrai sort (115167) dit : « les eaux corrompues DE LA
FONTAINE infligent des dégâts de Givre ». L'eau n'est pas dangereuse en
soi : elle le devient fontaine par fontaine, pendant que le boss les
souille l'une après l'autre — une toutes les 29 s dans son propre script.
D'où la consigne connue du combat : tourner le long des zones sèches
jusqu'à ce que les quatre Ondes vivantes soient mortes, puis se placer
sur l'anneau sec pour la phase du jet.

CORRECTIF
Un joueur dans l'eau ne prend des dégâts que s'il est à portée d'une
fontaine DÉJÀ corrompue (aura 106518, posée par le script du boss) :
  - aucune fontaine souillée -> l'eau est inoffensive ;
  - chaque fontaine corrompue noie la moitié de cuvette la plus proche
    d'elle, les zones sèches se réduisent ;
  - les quatre corrompues -> toute la cuvette est mortelle, et c'est le
    moment où la phase 2 commence.

La portée de 30 m est le rayon du sort officiel 115167 (SpellRadius
ligne 10, build 7.3.5.26972), pas un chiffre choisi au jugé. Les
fontaines étant à 24,7-29,2 m du centre et la cuvette faisant une
dizaine de mètres de rayon, il découpe naturellement la cuvette en deux
par fontaine.

Reset() du boss purge les auras des fontaines : une mort de groupe
remet bien le compteur à zéro.

RESTE À FAIRE
- La sonde TJSWATER est conservée le temps de la validation en jeu ;
  elle sera retirée ensuite.
- Nous lançons toujours 106778 « Corrupted Waters NOT READY », le
  brouillon inachevé de Blizzard, au lieu de 115167. Dégâts comparables
  (5 000 contre 4 749 en normal) mais sans les paliers héroïque et
  mythique. Non basculé ici : 115167 utilise un ciblage par destination
  qui demande d'être traité à part.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-24 23:23:13 +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 673bad73b3 Sagesse de Mari : « Lessiver » ne balayait pas, le parametre force manquait
Signale en jeu apres le correctif de ligne de vue : le sort restait fige
au lieu de balayer la salle.

Unit::SetFacingTo abandonne en silence quand la creature nest pas a
larret :
    if (!force && !IsStopped()) return;
Or la phase 2 lance MovePoint vers la position de depart juste avant :
elle EST en deplacement, la rotation ne partait donc jamais. Et le
SetOrientation qui precede ne met a jour que la valeur serveur, sans
prevenir les clients.

Seuls les deux appels de la phase 2 recoivent force = true. Le troisieme,
celui de lHydrolance en phase 1, est laisse tel quel : elle est a larret
a ce moment-la et il fonctionne.

Sondes retirees : la sonde a montre que la mecanique du combat est saine
— quatre fontaines trouvees, un elementaire invoque a chaque appel
(compteur 0 puis 1, 2, 3) et bouclier retire a foutainCount=4. Le seul
defaut etait la ligne de vue, corrigee au commit precedent. Le blocage
signale par le joueur — « les elementaires sont coinces, on ne peut pas
les buter, du coup le boss garde son bouclier » — sexplique entierement
par la : il ne pouvait frapper personne.
2026-08-24 12:08:45 +02:00
SylvaniaCore deploy c880268e8c Temple du Serpent de jade : aucun sort a distance ne passait dans la salle du bassin
Signale par « le baltring » puis reproduit : aucun sort a distance
naboutit sur aucun PNJ de la Fontaine des Temoins, et la Sagesse de Mari
etait annoncee « hors de portee de vue » alors quelle est visible a
7 metres.

Fausses pistes ecartees avant de trouver, toutes verifiees : les drapeaux
(32832 est exactement celui du Sha du doute, jouable), un objet du monde
qui bloquerait (aucun a moins de 15 m), des tuiles de collision
manquantes (0960_36_30.vmtile fait 82 Ko, la plus grosse de la carte),
une position aberrante, et le phasage.

Mesure faite par une sonde posee dans IsWithinLOS. Sur 39 echecs :
tous tiennent dans une boite de 26 x 18 m — la salle et rien quelle, le
reste du donjon est indemne ; la tranche daltitude est etroite, 172,6 a
174,3 ; les distances vont de 4 a 18 m, donc meme a bout portant ca
bloque ; et la Sagesse de Mari elle-meme echoue a viser les joueurs.
Il y a donc de la matiere de collision A LINTERIEUR de la piece, dans la
tranche ou tout le monde se tient : lextraction du modele est fautive,
pas un fichier manquant.

Deplacer les creatures ne servirait a rien, le joueur aussi est dans la
zone fautive. La ligne de vue est donc neutralisee, mais UNIQUEMENT
quand les DEUX extremites du rayon sont dans le bassin. Hors de cette
boite, et sur toute autre carte, le calcul reste strictement inchange.

A retirer si les cartes de collision de la carte 960 sont un jour
re-extraites correctement.
2026-08-24 11:53:45 +02:00
SylvaniaCore deploy bfb9fe864b Plantage : m_playerStorage netait alloue nulle part
Le serveur est tombe le 24/08/2026 dans le Temple du Serpent de jade,
SIGSEGV. Pile du vidage memoire, sans ambiguite :
  PlayerStorage::IsEntryExists
  <- spell_monk_mastery_combo_strikes::HandleHit
  <- Spell::HandleEffects <- HandleCastSpellOpcode
Larret est a IsEntryExists+4, cest-a-dire au tout premier acces a this.

m_playerStorage est DECLARE dans Player.h et lu par GetStorage(), mais
alloue NULLE PART dans tout le depot : ni liste dinitialisation, ni
corps du constructeur, aucune affectation. Le pointeur contenait donc
des ordures des la construction du joueur.

Quatre scripts du Moine le deferencent sans controle dans spell_monk.cpp
— maitrise « Frappes combinees », Poings de furie. Le premier moine a en
declencher un faisait tomber le worldserver. Ce netait quune question de
temps : la classe est utilisee depuis toujours sans jamais avoir existe.

La classe PlayerStorage est parfaitement fonctionnelle, il ne manquait
que son allocation. Elle est desormais creee dans le constructeur et
liberee dans le destructeur : le plantage disparait ET la maitrise du
Moine devient operante.

Ceinture et bretelles : les quatre appels recoivent en plus une garde de
nullite, pour quun oubli similaire ne soit plus jamais fatal.
2026-08-24 11:17:57 +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
SylvaniaCore deploy a3ae3ab095 Rivage brise : les cinq PNJ declencheurs invisibles etaient absents
Cinq objectifs obligatoires du retour dans les capitales reposent sur
des Proxy invisibles dont aucun netait pose : Ecouter le roi Anduin
(40517), puis Rencontrer Saurfang, Entrer dans lEnclos de Grommash,
Apprendre le destin de la Horde et Parler au chef de guerre (40522).

Positions issues de quest_poi_points, chacune validee par son
voisinage : Anduin a 3,6 m du premier, Garrosh Hellscream a 1,8 m de
celui de lEnclos, et celui du chef de guerre tombe a 4,5 m de la
Sylvanas posee au commit precedent — confirmation croisee.

Seule exception assumee : 100934 na aucun point dinteret en base. Il est
pose avec 100985 car il le precede immediatement dans la sequence et que
les deux se deroulent devant Sylvanas.

Mecanisme : evenement 10 a vue hors combat puis action 33, le motif deja
fonctionnel sur ce serveur (Gerk 29455, Burr 29454, Croise Dargath
29468). Portee reduite a 10 m pour les deux qui partagent un emplacement,
sinon ils se declencheraient ensemble et la sequence perdrait son sens.
2026-08-23 17:07:42 +02:00
SylvaniaCore deploy 1cebbf24d4 Rivage brise : les chefs de faction nexistaient nulle part
Audit du 23/08/2026 sur 43 quetes. Quatre PNJ portent le drapeau de
donneur ou de recepteur mais nont aucune ligne dans creature : tout le
retour dans les capitales apres la defaite du Rivage brise etait
inaccessible, pour les deux factions.

Coordonnees non inventees : les X/Y viennent de quest_poi_points, la
table des points dinteret issue des donnees client, dont lentree
dindice 0 marque lemplacement du donneur. Laltitude est reprise des
creatures deja posees a moins de 3 m. Confirmation frappante : Anduin
100973 tombe sur le camp illidari de Hurlevent (Elerion Chantelame a
0,5 m) et Sylvanas 101035 sur son pendant exact a Orgrimmar (Elthyn
Darai a 0,2 m).

100429 nest volontairement pas apparu : son point dinteret est occupe
par un autre Anduin deja pose (107574, drapeau de donneur, deja
recepteur de trois quetes). Les serveurs officiels les separent par
phase ; ici cela ferait deux Anduin cote a cote sur le trone. Le role de
recepteur de 40517 va donc a celui qui est deja en place, comme pour
Maiev au Caveau des Gardiennes.

Phasage ignore, comme le fait LegionCore dans son propre correctif
dintroduction Legion.
2026-08-23 16:57:32 +02:00
SylvaniaCore deploy cb60076a92 Depart des Illidari : la version Alliance ne teleportait nulle part
Signale en jeu : la quete finale de la campagne Chasseur de demons sort
bien un personnage Horde de la zone, mais laisse un personnage Alliance
sur la carte 1468.

Le script npc_khadgar est correct et rattache, ses deux constantes aussi
(39689 Alliance, 39690 Horde). Il lance 192757 ou 192758 selon la quete.
Mais spell_target_position ne contenait de destination que pour la
version Horde. Le sort Alliance sincantait dans le vide.

Destination retenue : le camp illidari de Hurlevent, position dElerion
Chantelame 101004, entoure de Falara Chantenuit, du Trafiquant illidari,
de lExecuteur illidari et des gardes de la ville. Elerion est le donneur
Alliance de la quete suivante 44663, son homologue Horde etant Elthyn
Darai a Orgrimmar.

Ecartee : (-8998.14, 861.25, 29.62), destination des sorts de
teleportation a Hurlevent deja en base (3561, 121857). Le voisinage
montre quil sagit de la salle des portails du Quartier des mages.
2026-08-23 15:50:25 +02:00
SylvaniaCore deploy 82eb6e808e Nouveau type de condition : specialisation du joueur (53)
« Arretez Guldan ! » etait proposee en double par Maiev. Les quetes 38723
et 40253 partagent titre, prerequis, tri, et sont ouvertes a toutes les
races : rien ne les departageait. Ce ne sont pas des variantes
Horde/Alliance malgre le nom des constantes QUEST_STOP_GULDAN_H/_A — le
meme fichier les nomme correctement plus bas DMG_SPEC et TANK_SPEC. Ce
sont des jumelles de specialisation.

Le gestionnaire de conditions navait aucun moyen de tester la
specialisation. Le contournement par un sort caracteristique netait pas
tenable : les sorts de specialisation ne sont quasiment pas enseignes
sur ce serveur, les trois Chasseurs de demons existants ne connaissent
que Morsure de demon et celui de niveau 98 na pas sa Metamorphose. Une
condition batie dessus aurait masque les DEUX quetes.

CONDITION_SPECIALIZATION lit Player::GetPrimarySpecialization() et
valide la valeur contre ChrSpecialization.db2 au chargement.

Formulation retenue en base : la quete Vengeance exige la spe Vengeance,
la quete Devastation exige de NE PAS etre Vengeance. Il y a ainsi
toujours exactement une quete proposee, meme si la specialisation vaut
zero — un doublon agace, zero quete bloque.

Reutilisable : le serveur compte 1488 paires de quetes homonymes
partageant prerequis et races.
2026-08-22 14:47:59 +02:00
SylvaniaCore deploy 6a11a9deb0 Correctif du fichier SQL : les accents graves avaient ete manges par le shell 2026-08-22 13:37:04 +02:00
SylvaniaCore deploy 4168f54732 Caveau : la correction de reapparition ne couvrait quune partie des PNJ
Signale en jeu : certains PNJ revenaient, dautres non. La premiere passe
etait restreinte a une liste de factions fixee davance, ce qui laissait a
7200 s des creatures qui meurent pourtant : les 35 Illidari liberes et
les 36 Gardiens du Caveau qui tombent en combattant les demons, les 47
Sangsues dame, les 56 cafards et rats, et surtout Marteau et Pilon, les
deux gardes de « Arretez Guldan ! » — deux heures dattente apres un
echec.

Mardum tranche : la zone jumelle applique ses 120 secondes
uniformement, PNJ de quete compris. Toute la carte 1468 passe donc a 60
secondes, sauf les Portails de la Legion.

Ces derniers etaient eux-memes incoherents : six des sept a 7200, un
seul a 300. Cibles de lobjectif bonus, ils disparaissaient deux heures
une fois detruits. Alignes sur les 300 secondes deja presentes dans les
donnees.
2026-08-22 13:36:32 +02:00
SylvaniaCore deploy 56aad7fe75 Caveau des Gardiennes : toute la carte etait a 2 heures de reapparition
Signale en jeu : dans le secteur de la Garde illidari, les demons tues
ne revenaient pas. Une fois le secteur nettoye, lobjectif bonus
« Caveau des Gardiennes » et la quete 38689 « Infusion gangrenee »
devenaient infranchissables sans .respawn all, dont un joueur ne dispose
pas.

474 des 476 apparitions de la carte 1468 portaient spawntimesecs = 7200.
Cest un defaut dimport, pas une donnee authentique : la zone jumelle
Mardum (1481), meme campagne, a 1250 de ses creatures a 120 secondes,
rares et elites compris.

Les 152 apparitions de faction hostile passent a 60 secondes, valeur
choisie par lutilisateur. Le decor et les PNJ de quete ne sont pas
touches : ils ne meurent pas.
2026-08-22 13:22:29 +02:00
SylvaniaCore deploy cf21fde938 Glaives 38669 : les credits se declenchaient sur un evenement qui narrive jamais
Signale en jeu : le joueur arrive au Caveau des Gardiennes avec ses
glaives DEJA EQUIPES. La quete « Notre dernier espoir » lui demande de
les equiper, mais levenement dequipement a eu lieu avant quil ne prenne
la quete. Ne guetter que OnItemLevelChange laissait donc la quete
bloquee dans le cas le plus courant.

Le script verifie desormais a trois moments : equipement dun glaive,
acceptation de la quete, et connexion. Le dernier rattrape les
personnages deja bloques — une simple reconnexion suffit.
2026-08-22 13:11:37 +02:00
SylvaniaCore deploy 58352a9b01 Zone DH : suppression de 16 lignes SmartAI mortes et dune reference dobjet inconnu
Le journal du premier demarrage a montre deux choses.

Les huit lignes SMART_EVENT_DAMAGED de 92776 et 92782, qui faisaient
lancer 133511 « Fel Infusion: Kill Credit » a lattaquant, avaient tous
leurs parametres a zero. Le test du core (var0 > max) rejette alors tout
degat : elles ne se sont jamais declenchees. Cela confirme que le credit
89297 navait bien aucune source. Supprimees, le credit etant desormais
accorde a la mort.

132138 « Radiant Fel Ash » nexiste pas dans les donnees de ce client :
la ligne de butin etait ignoree au chargement, elle est retiree. 132753
et 147430 nont provoque aucune erreur, ces ajouts sont valides.

Note de conception dans le fichier : lavertissement de SmartAIMgr
invitant a preferer le sort a laction 33 nest volontairement pas suivi,
il faut dix credits par demon et rien ne garantit que dix incantations
successives du meme sort passent.
2026-08-22 12:29:33 +02:00
SylvaniaCore deploy 1474d24cc1 Zone DH : six quetes debloquees et butin realigne sur Wowhead
Audit complet des 42 quetes de Mardum (1481) et du Caveau des Gardiennes
(1468) apres une traversee de la campagne ou les blocages avaient ete
franchis a la commande GM. Six quetes restaient impossibles a terminer
normalement.

Quetes sans aucun donneur
  38668 / 38669 « Notre dernier espoir » et 38689 « Infusion gangrenee »
  n'avaient aucune ligne creature_queststarter. Attribuees a leur
  recepteur deja en place (Maiev 92718, Altruis 92986), tous deux deja
  porteurs du drapeau de donneur. L'ordre officiel de la chaine est
  retabli via PrevQuestID (38668 -> 38669 -> 38672 -> 38689 -> 38690 ->
  38723/40253), ce qui corrige au passage le piege signale en jeu :
  accepter « La gangr'evasion » faisait partir Maiev avant que les
  autres quetes aient pu etre prises.

Objectifs obligatoires sans aucune source
  38690 : les huit « Warden Cell » (244588) etaient posees mais inertes
          — aucun AIName, aucun script, tous les Data a zero. SmartAI
          ajoute sur le motif de la « Scourge Cage » 187854.
  38672 : les cellules 103655/103658 avaient tout leur SmartAI sauf
          l'action 33. Le script C++ prevu n'aurait rien regle : non
          rattache, lignes de credit commentees, et entrees erronees.
  38723/40253 : le credit « Face Gul'dan » 99303 dependait d'une scene
          absente de scene_template. Ajoute a la liste d'actions de
          Maiev, qui reproduit deja la scene.
  38689 : les quatre demons du caveau accordent desormais l'energie
          gangrenee, dix par mort, comme le prevoyait npc_fel_infusion.
  38765 : go_mardum_portal_shivarra appelait ForceCompleteQuest sous la
          condition inverse de ses deux jumeaux. Remplace par les credits
          94407 et 97831, sur le schema des portails Cendrelangue et
          Glissentaille.
  38669 : nouveau PlayerScript accordant les credits des glaives via
          OnItemLevelChange. Aucun identifiant d'objet code en dur : on
          verifie la sous-classe WARGLAIVES dans chaque emplacement.

Butin
  Compare aux tables officielles de Wowhead pour les 17 creatures
  tuables de la zone. Le menu fretin de Mardum ne lache officiellement
  rien : lootid = 0 etait correct, rien n'a ete touche. Manquaient en
  revanche 132753 « Rations de la Legion » (absente des 46 000 lignes de
  butin du serveur), 129196 sur quatre creatures, 147430, 132138, et
  sept des huit lignes de l'Inquisiteur Funeste. Les objets
  post-Legion que Wowhead attribue a ces creatures sont ecartes, et les
  taux existants ne sont pas modifies.
2026-08-22 12:23:11 +02:00
SylvaniaCore deploy adaaa7d232 Bastillax : sorts lances en mode declenche, boss intuable en solo
Signale en jeu : boss juge trop puissant. Ses statistiques sont pourtant
authentiques - modificateur de vie 14, rang elite, VerifiedBuild 25549 -
et identiques a celles de Sledge, Crusher et Tyranna deja vaincus.

Le probleme venait du script : les trois sorts etaient lances avec
triggered = true, donc instantanes et non interruptibles. Or ils ont tous un
temps dincantation cote client :
  200007 Annihilation gangrenee : 3 s, cone frontal   -> il faut en sortir
  200027 Ombres ecrasantes      : canalise 5 s        -> interruptible
  200002 Effacement tenebreux   : 2 s, +100% desquive -> interruptible

Toute la parade disparaissait. Surtout, le bouclier desquive a 100% montait
instantanement toutes les 6 s : le boss esquivait la quasi-totalite des
coups. Ce netait pas un boss surpuissant mais un boss intouchable.

Passage en incantation normale sur les trois. Comportement authentique
retabli, aucune statistique modifiee.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-22 11:22:34 +02:00
SylvaniaCore deploy c47aedbfd7 La liberte a portee dailes : le donneur est le champion du joueur
Troisieme et derniere correction de lattribution. Indication de
lutilisateur en jeu, qui tranche.

La carte 1468 compte ONZE Kayn et un seul portait un drapeau de donneur,
do deux tentatives a cote :
  96666 (4161,-856,291) salle finale, AU-DELA de Bastillax : il fallait
        depasser la cible pour prendre la quete qui demande de la tuer
  97273 (4186,-610,255) colle a Bastillax mais isole, pas le champion

Le bon endroit est le point de ralliement du sommet (~4280,-450,260) ou se
tiennent Kayn 97265, Altruis 97267 et Korvas 97644 - cette derniere etant
celle qui vient de faire choisir son champion au joueur. Le champion
enchaine donc sur la quete suivante.

Don attribue aux DEUX champions possibles pour ne pas bloquer un joueur
ayant choisi Altruis. 97273 remis dans son etat dorigine. 96666 conserve
comme donneur de secours, il reste le recepteur declare.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-21 23:17:34 +02:00
SylvaniaCore deploy d10873b2b2 Ecran de chargement fige : le serveur ne repondait pas aux tables DB2 inconnues
Preuve dans Server.log, exactement une fois par tentative de connexion
bloquee :
  CMSG_DB_QUERY_BULK: [Daemon] requested unsupported unknown hotfix type:
  3386291891

HandleDBQueryBulk se contentait de journaliser puis de RETURN sans envoyer
la moindre reponse. Le client, qui attend une reponse par enregistrement
demande, restait bloque indefiniment a lecran de chargement.

Corrige en emettant une reponse negative (Allow a false) pour chaque
enregistrement demande, comme le fait deja la branche enregistrement
introuvable juste en dessous.

Portee generale : nimporte quel client reclamant une table que ce core ne
connait pas restait bloque, quelle que soit la carte. La table en cause ici
etait 0xC9D6B6B3, absente des metadonnees du core.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-21 22:56:32 +02:00
SylvaniaCore deploy 67ed679f9c Fin du Caveau : les deux dernieres quetes navaient aucun donneur
Apres Une nouvelle direction (40373), la campagne sarretait net.

1) La liberte a portee dailes (4 variantes spe x faction) : recepteurs
Kayn 96666 et Altruis 96669, aucun donneur. Attribue a Kayn pour les
quatre - il en est deja recepteur, il est le SEUL des deux a etre spawne
(96669 na aucun spawn nulle part), et il porte npcflag=3. Le champ
AllowableRaces filtre deja Alliance/Horde.

2) Le depart des Illidari (39689/39690) : recepteur Khadgar 97978, dont le
script gere justement le OnQuestReward de ces deux quetes. Il arrive a la
fin de la quete precedente, cest donc lui qui enchaine.

Limite connue : rien ne filtre la SPECIALISATION (ce core na aucun type de
condition pour cela), un joueur verra les deux variantes de sa faction.
Meme limite que les deux Arretez Guldan.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-21 22:45:41 +02:00
SylvaniaCore deploy 95913f26d2 Choix du compagnon : la fermeture du dialogue effacait le choix autorise
Preuve dans Server.log : "tried to respond to invalid player choice 234
(allowed 0)". Le clic atteignait bien le serveur, mais celui-ci avait
memorise 0 au lieu de 234.

Enchainement fautif dans npc_korvas_bloodthorn::OnGossipSelect :
  1. CastSpell(196650) -> EffectLaunchQuestChoice -> SendPlayerChoice(234)
     inscrit PlayerChoiceId = 234
  2. CloseGossipMenuFor() -> SendCloseGossip() -> _interactionData.Reset()
     remet PlayerChoiceId a 0
La fenetre saffichait (le paquet etait deja parti) mais le serveur avait
oublie quel choix il autorisait. Cest pour cette raison que le tome de
Mardum fonctionne : lui ne ferme pas le dialogue.

Corrige en fermant AVANT de lancer le sort. Balayage de tout le core :
34 occurrences du motif CastSpell puis CloseGossipMenuFor, mais une seule
autre concerne un sort qui affiche un choix (class_hall_hunter.cpp), les
autres lancent des sorts ordinaires ou reinitialiser est sans effet.
Les deux sont corrigees.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-21 22:42:40 +02:00
SylvaniaCore deploy d377beadaf Choix du compagnon (234) : les boutons ne confirmaient pas
La fenetre saffichait correctement mais cliquer ne confirmait rien. Le
handler serveur est pourtant sain : HandlePlayerChoiceResponse appelle
OnPlayerChoiceResponse puis nexige aucune recompense. Le clic narrivait
donc pas jusquau serveur.

Seule divergence structurelle avec le choix 231, qui fonctionne : celui-ci
possede une ligne playerchoice_response_reward par reponse, entierement a
zero, la ou 234 nen avait aucune. Dans SendPlayerChoice, le bloc Reward
nest emis que si Reward existe : les reponses de 234 partaient donc sans ce
bloc. Les deux choix partagent par ailleurs le meme jeton de confirmation
et le meme style dinterface.

HYPOTHESE EMPIRIQUE, pas une cause prouvee : impossible dobserver ce que le
client fait du bloc manquant. Cest la seule divergence entre un choix qui
marche et un qui ne marche pas, et le changement naccorde rien a personne.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-21 22:35:48 +02:00
SylvaniaCore deploy 69c9781828 Quatre hooks morts OnCompleteQuestChoice + quete 40373 injouable
Signale en jeu : choisir entre Kayn et Altruis ne declenche rien.

1) HOOK MORT, 4 occurrences. OnCompleteQuestChoice est declare dans
ScriptMgr mais appele DE NULLE PART ; le seul hook invoque a la reception
dun choix est OnPlayerChoiceResponse (QuestHandler.cpp). Corrige dans :
  zone_vault_of_wardens.cpp      choix Kayn / Altruis
  zone_legion_dalaran_legion.cpp Dalaran
  class_hall_dh.cpp              fief chasseur de demons
  class_hall_hunter.cpp          fief chasseur
Meme defaut que celui corrige a Mardum (commit 81b37487). Dautres fichiers
(class_hall_monk, class_hall_artifact_choices) utilisaient deja le bon nom,
ce qui confirme le diagnostic.

2) CREDIT MANQUANT. Le handler ne lancait quun sort : lobjectif 99278
(choisir entre Kayn et Altruis) de la quete 40373 netait accorde par rien.

3) QUETE SANS DONNEUR. 40373 a un recepteur et deux objectifs coherents
mais aucune ligne creature_queststarter. Attribuee a Korvas 97644 : elle en
est deja la receptrice, cest son propre script qui ouvre la fenetre de
choix, elle recoit aussi la quete precedente 39686, et elle porte npcflag=3.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-21 22:28:59 +02:00
SylvaniaCore deploy e2300ba4a5 Choix du compagnon (Kayn / Altruis) : texte affiche en russe
La table playerchoice stocke ce texte directement en russe (ChoiceId 234)
et aucune ligne de localisation frFR nexistait. SendPlayerChoice lit la
table de base puis lecrase par la version localisee si elle existe : on
remplit donc playerchoice_locale et playerchoice_response_locale plutot que
decraser la base, ce qui reste reversible et sans perte pour un russophone.

Traduction redigee, terminologie francaise du jeu, balisage de couleur et
sauts de ligne preserves.

SIX AUTRES CHOIX SONT AUSSI EN RUSSE et restent a traduire : 237 et 238
(gemme et anneau), 247/262/265/280 (choix darme prodigieuse, qui concerne
toutes les classes).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-21 22:18:37 +02:00
SylvaniaCore deploy 5aad9e8887 Caveau des Gardiennes : rattachement de 11 IA C++ orphelines
zone_vault_of_wardens.cpp declare 26 scripts, UN SEUL etait rattache. Toute
la fin de la campagne DH en dependait : Bastillax, le Bassin du Jugement,
Khadgar, le choix entre Kayn et Altruis.

Les commentaires du fichier sont trompeurs et mont induit en erreur trois
fois : lentree 243967 y est donnee pour DEUX scripts differents et elle est
fausse dans les deux cas ; 197180 est un identifiant de sort presente comme
une creature. Chaque correspondance a donc ete etablie par les donnees - nom
en base, role de donneur/recepteur de quete, ou proximite geographique - puis
verifiee. Detail de chaque identification dans len-tete du patch.

Innocuite : les 11 cibles nont NI ScriptName NI ligne smart_scripts, il ny a
rien a remplacer.

Non rattaches deliberement : 92718 Maiev, 92986 Altruis, 99631, 99632, les 4
scripts de combat et les 2 cellules ont tous un SmartAI actif et exigeraient
une comparaison ligne a ligne - meme prudence quà Mardum, ou deux IA C++ se
sont revelees etre des ebauches inferieures au SmartAI en place.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-21 12:38:00 +02:00
SylvaniaCore deploy 8f11734ee3 Caveau des Gardiennes : ascenseur et Portails de la Legion rattaches
1) Quete 39686 Jusquau sommet ne se validait pas. Son unique objectif
attend le credit 96814, quaucune source naccordait : le code C++
go_warden_ascent (surveille les joueurs a moins de 10 m et credite des que
leur Z depasse 253) netait pas rattache au gameobject 244644, lascenseur.

2) Portails de la Legion (99501, 114358) rendus fonctionnels - demande
explicite de lutilisateur. Ils sont indispensables a lobjectif bonus 39742
(34 ennemis a credit 97969) : les 119 creatures qui donnent ce credit ont un
respawn de 2 h, donc un joueur traversant la zone une fois ne peut pas
boucler lobjectif. Les portails sont la source renouvelable prevue.
Trois obstacles cumules leves : npcflag 0 -> 1, retrait de NOT_SELECTABLE
sur 99501 (33555200 -> 768, immunites conservees pour quil reste cliquable
sans etre frappable), et ScriptName vide -> npc_legion_portal.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-21 12:07:02 +02:00
SylvaniaCore deploy ed3ca4ccb8 Caveau des Gardiennes : Kayn (92984) ne pouvait donner aucune quete
Signale en jeu : plus aucune quete apres Le soulevement des Illidari. En
base, 12 quetes du Caveau jamais prises et le joueur bascule directement
sur Dalaran (44663).

Kayn 92984 est declare donneur de 39682 Envole-moi dans creature_queststarter
mais son npcflag valait 0 : aucun drapeau de dialogue ni de donneur. Or
cest la quete dentree de toute la branche haute - elle donne la
chauve-souris qui permet de monter chez Allari (96675) et Korvas (97643),
places a z=126 alors que Kayn est en bas a z=-282.

Aligne sur npcflag=3 comme ses deux collegues donneurs de la zone.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-21 11:50:28 +02:00
SylvaniaCore deploy ce2516a8a5 Caveau des Gardiennes : Mirana et Drelanim ripostaient aux degats de zone
Signale en jeu : Mirana attaque le joueur quand il laide a combattre les
demons. Elle nattaquait pas delle-meme.

Deroule de Unit::GetReactionTo avec la faction 2643 : pas hostile aux
joueurs (groupe ennemi 8 = Legion), pas amicale non plus (groupe ami 0),
pas de drapeau HOSTILE_BY_DEFAULT -> retombe sur REP_NEUTRAL. Neutre veut
dire ATTAQUABLE : les degats de zone du chasseur de demons la touchaient et
elle ripostait.

Ces deux PNJ etaient les seuls de la carte 1468 en 2643. Tous les autres
allies du Caveau sont en 2804, qui declare les joueurs comme amis tout en
restant hostile a la Legion. Alignes sur leurs pairs.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-21 11:44:20 +02:00
SylvaniaCore deploy 42e7f208db Caveau des Gardiennes : credit manquant sur Crusher et Sledge (quete 38723/40253)
Lobjectif 3 de Arretez Guldan (credit 106241, Crusher and Sledge slain and
power taken) netait accorde par AUCUNE source : aucune ligne smart_scripts
avec action 33 param 106241 sur tout le serveur, et le code C++ qui le
donne nest pas rattache.

Constat plus large : zone_vault_of_wardens.cpp declare 26 scripts et UN
SEUL est lie en base. 25 IA ecrites et jamais branchees - Maiev, Kayn,
Altruis, les geoliers, les portails, les miroirs.

Credit ajoute au SmartAI existant plutot que de rattacher le C++ : cela
evite de remplacer le SmartAI de Sledge (7 lignes) et de reconduire la
fragilite du C++, qui naccorde le credit quaux joueurs presents dans la
liste de menace au coup fatal - le motif exact qui avait bloque Tyranna
(commit 7987f07d). Cible 18 = tous les joueurs a 100 m, sans condition.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-21 11:18:38 +02:00
SylvaniaCore deploy 01cbf6b3ca Mardum : le tome des secrets gangrenes nest plus recliquable
Le livre relancait le choix de specialisation sans aucune condition : le
joueur pouvait le rouvrir et reprendre lautre spe a volonte. Chaque passage
relance LearnSpell + ActivateTalentGroup et reaccorde le credit de quete.

Consequence observee le 18/08/2026 sur un personnage de test :
primarySpecialization restee a 577 (Devastation) alors quil portait larme
de Vengeance et avait recu la variante Vengeance de Cry Havoc.

Deux gardes : le livre ne souvre plus une fois la quete 40051 validee, et
le gestionnaire de reponse refuse de sappliquer deux fois quelle que soit
la facon dont la fenetre serait rouverte.

NOTE : ces 16 lignes etaient deja EN SERVICE depuis hier - embarquees par
les compilations suivantes - mais jamais commitees. Elles le sont enfin.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-20 11:46:27 +02:00
SylvaniaCore deploy 193d36dcbc Sage Mari : ecriture hors limites sur le tableau des fontaines
Signale en jeu : premier boss du Temple du serpent de jade infaisable, le
bouclier du boss ne tombe jamais.

Le tableau foutainTrigger a 4 cases (indices 0-3), mais les deux acces
utilisaient la PRE-incrementation :
  ecriture : foutainTrigger[++tab]          -> indices 1,2,3,4
  lecture  : foutainTrigger[++foutainCount] -> indices 1,2,3,4
Lindice 0 netait jamais rempli, et lindice 4 ecrivait 16 octets hors
limites - juste par-dessus hydrolancePhase, declare immediatement apres le
tableau. La salle contenant exactement 4 Fountain Stalker (56586), le
debordement etait systematique a chaque pull.

Corrige en post-incrementation des deux cotes, avec garde de borne a
lecriture. La condition de fin de phase (foutainCount == 4) reste juste.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-19 22:33:55 +02:00
SylvaniaCore deploy 0ed9cfa20d Mercenaires : le mercenaire sort du portail, et sait enfin qui il est
Quatre corrections nees d une soiree d essais en jeu.

Le mercenaire etait teleporte sur son employeur et non sur la structure qui
l invoque : en reculant de quelques pas avant de payer, on le voyait apparaitre
loin du portail. Le contrat retient desormais la position de la structure ; le
mercenaire en sort a un ou trois metres, l angle tire au hasard pour que quatre
recrues ne s empilent pas, face au portail qu il vient de franchir, la hauteur
recalee sur le terrain. BotGroupAI expose pour cela un teleport vers un point
precis - un bot n a pas de client pour accuser reception, seul BotAITeleport
simule cet echange.

Il jurait ensuite selon sa faction : un demoniste de l Alliance invoquait donc la
Lumiere, qui est precisement ce qui le brule. Les serments viennent maintenant de
la CLASSE et l origine de la RACE. Nuance importante : demonistes et chevaliers
de la mort ne se reclament jamais de la Lumiere, mais peuvent la maudire et s en
moquer - c est leur role.

Enfin, les refus passagers des fournisseurs (503, 429) sont retentes deux fois
avant d abandonner, dans le fil dedie.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-19 11:04:30 +02:00
SylvaniaCore deploy a3055a32f6 Mercenaires : le mercenaire connait son monde, et sait ou il se tient
Il tenait son role mais parlait dans le vide. Trois ajouts.

Un socle sur Azeroth a l heure de la Legion : les Iles Brisees, Dalaran qui
flotte, les armes prodigieuses, Sargeras, le retour d Illidan, les continents,
les capitales des deux factions, la monnaie. Avec une contrainte qui compte
autant que le reste : il n a JAMAIS entendu parler de ce qui vient apres -
Kul Tiras, l Ombreterre, les Dragons. Un modele entraine sur tout le corpus de
Warcraft racontait sinon des evenements qui n existent pas sur ce royaume.

Le lieu reel ensuite : la zone et la sous-zone sont lues dans les tables du
client (AreaName->Str[locale]) et injectees a chaque replique. Le mercenaire
peut enfin rechigner sur le froid d une region qu il traverse vraiment.

Enfin, la relance des refus passagers. Les paliers gratuits repondent
regulierement 503 ou 429 ; renoncer au premier essai laissait le mercenaire muet
pour une gene d une seconde. Trois tentatives espacees, dans le fil dedie - la
boucle du monde n en sait rien. Un refus definitif, lui, n est jamais retente.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-19 10:41:15 +02:00
SylvaniaCore deploy bf58c59f3d Chat : la meme faille SQL existait dans le chat de groupe des bots
Le correctif precedent ne visait que le chuchotement, celui que la pile d appel
designait. La requete du canal de groupe (ai_talk_group) portait le meme defaut,
dans une boucle sur les membres qui plus est : une requete par bot present.

Le royaume est retombe cinq minutes apres le premier correctif, sur le meme mot -
« c est » - avec la meme erreur 1064. Lecon : chercher toutes les occurrences du
motif, pas seulement celle que le crash montre.

Retrait au passage de la trace de diagnostic temporaire : le message du
fournisseur, remonte au joueur en jeu, suffit desormais.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-19 00:13:33 +02:00
SylvaniaCore deploy 9b4851678f Chat : un simple apostrophe dans un chuchotement a un bot faisait tomber le royaume
Quand un joueur chuchote a un playerbot, le core cherche une reponse toute faite
dans ai_talk_whisper et injectait le message BRUT dans la requete :

    WHERE '%s' REGEXP cname

Une apostrophe - « c est », « j ai », une phrase de francais sur deux - cassait
la requete. MySQLConnection::_HandleMySQLErrno repond a une erreur SQL par un
abandon du processus : n importe quel joueur faisait donc tomber le serveur en
adressant la parole a un bot, et pouvait y injecter du SQL au passage.

Trois crashs SIGSEGV en une soiree (23h06, 23h44, 23h58), tous avec la meme pile
HandleChatMessage -> DatabaseWorkerPool::Query -> _HandleMySQLErrno -> Abort. Le
defaut preexistait, mais le module de dialogue l a reveille : jusqu ici personne
n adressait la parole aux playerbots.

Le message est desormais echappe et borne a 255 caracteres.

Second changement, sans rapport : Mistral devient un fournisseur a part entiere.
Il parlait deja le dialecte d OpenAI, mais « mistral » n etait qu un alias : sans
adresse explicite, la cle du joueur partait chez OpenAI, qui la rejetait par un
401 incomprehensible. Il a maintenant son adresse par defaut, et l aide en jeu
signale que Gemini ne repond pas depuis un serveur.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-19 00:03:58 +02:00
SylvaniaCore deploy 77c5c68e76 Mercenaires : dialogue par modele de langage, cle fournie par le joueur
Le mercenaire parle desormais avec le modele de langage de son employeur, paye
par la cle d API de celui-ci. Inspire de mod-ollama-chat (AzerothCore), mais
avec trois exigences qui changent l architecture : cle apportee par le joueur,
plusieurs fournisseurs, aucune persistance.

Trois adaptateurs natifs : OpenAI (et tout service parlant son dialecte, via une
adresse personnalisee : Mistral, Groq, OpenRouter, Ollama, LM Studio), Anthropic
et Gemini. Le joueur fournit sa cle en jeu par « !api <fournisseur> <modele>
<cle> », la retire par « !api off ».

La cle n atteint jamais un disque. Elle est interceptee des la premiere
instruction de HandleChatMessage, avant tout journal et toute rediffusion ;
elle vit en memoire, est ecrasee caractere par caractere avant liberation - un
simple clear() laisserait le secret lisible dans le processus - et disparait a
la rupture du dernier contrat, a la deconnexion et a l arret du royaume.

Aucun appel reseau ne part du fil du monde : un fil dedie consomme une file
d envoi, les reponses reviennent par une file relue au tick. Un appel prend une
a dix secondes ; le faire dans la boucle du monde figerait le royaume a chaque
replique.

Le mercenaire repond dans le canal ou on lui parle. Le chuchotement reste
l affaire de l employeur ; dans le groupe et a voix haute, tout compagnon peut
l interpeller, mais un seul mercenaire repond - celui qu on nomme, sinon le
premier sous contrat - et c est toujours la cle de l employeur qui paie.

Contrepartie indispensable : les ordres passent au prefixe « ! » (!follow,
!stop, !@heal stop). Sans cela, le mot « stop » au detour d une phrase aurait
fige le mercenaire.

Deux obstacles contournes : le rapidjson embarque ne compile plus avec GCC 14
et le core ne s en sert que par son lecteur evenementiel - un extracteur JSON
cible le remplace, echappements et sequences Unicode compris ; libcurl est lie
directement plutot que d activer WITH_CPR, qui recompilerait curl et cpr en
entier pour le meme service.

Inclut un correctif sans rapport decouvert en chemin : une recrue du siege des
capitales abandonnee en depassement de delai etait rayee des registres sans
etre deconnectee, et chaque assaut laissait ainsi quelques bots vagabonder.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-18 23:08:07 +02:00