3a4c6c01dd3f28554fb2fbbc508aff456f7d0fec
230 Commits
| Author | SHA1 | Message | Date | |
|---|---|---|---|---|
|
|
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> |
||
|
|
b0b876b76b | README : renvoyer vers le wiki, section Documentation et allegement du depannage | ||
|
|
fa7a543b94 | worldserver.conf.dist : les 10 cles du module Mercenaires manquaient | ||
|
|
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> |
||
|
|
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> |
||
|
|
0ac509e421 |
Rivage brise 1460 : le phasage rendait les creatures inattaquables
Signale en jeu : creatures visibles, hostiles, mais impossibles a cibler
-- alors qu elles pouvaient attaquer le joueur.
J avais enchaine trois hypotheses (phase, factions, modeles souches).
Les trois etaient de VRAIS defauts et meritaient correction, mais aucune
n etait la cause. J aurais du poser la sonde d abord.
VERDICT DE LA SONDE, dans _IsValidAttackTarget :
Felblade Destroyer | vivante=1 | aucun drapeau bloquant
reaction=1 (hostile) | mesPhases=0 sesPhases=1
Le joueur n a AUCUNE phase, la creature en a une. PhaseShift::CanSee
exige une intersection des phases, et UpdateUnphasedFlag retire le
statut « non phase » des qu un objet en possede une. Aucune intersection
possible.
C est MA modification precedente qui a introduit ce decalage : j avais
place les 757 spawns en phase 169 en croyant que le joueur y etait,
en me fiant a un commentaire du script. Il ne l etait pas.
CORRECTIF : suppression du phasage des deux cotes, ce qui rejoint la
configuration de la reference -- le dump laisse les 757 placements de
cette carte SANS phase. La phase 169 n existe d ailleurs pas dans
Phase.db2 du build 7.3.5.26972.
- PhaseId remis a 0 sur les 757 creatures et les 101 objets ;
- AddPhase retire de OnPlayerEnter ;
- FinalizeSummon ne phase plus rien (conservee comme point de passage
unique, sans quoi les invocations deviendraient invisibles a un
joueur non phase -- le meme probleme en sens inverse).
La sonde ATTDBG est CONSERVEE le temps de la validation en jeu.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
|
||
|
|
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>
|
||
|
|
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> |
||
|
|
966a866e7c |
Mardum : le point de foyer etait fixe a l origine au lieu de la destination
Signale en jeu : « j ai utilise ma pierre de foyer qui ne m a pas
teleporte, je devais atterrir en foret d Elwynn et il est ecrit vous
renvoie a Fleur-de-l hiver alors que je n ai pas change le lieu ».
La pierre fonctionnait parfaitement : elle renvoyait a Mardum, ou le
joueur se trouvait deja -- d ou l impression qu elle ne faisait rien.
CAUSE, dans spell_mardum_back_to_black_temple :
player->TeleportTo(1468, 4325.46f, -620.53f, -281.40f, 1.517563f);
player->SetHomebind(player->GetWorldLocation(), 7873);
TeleportTo est ASYNCHRONE : le joueur n est pas deplace a la ligne
suivante, si bien que GetWorldLocation() renvoyait encore la position de
MARDUM. Le point de foyer se retrouvait donc fixe la ou le joueur venait
de partir, au lieu du Caveau des Gardiennes (carte 1468) visé.
Constate en base : character_homebind du personnage pointait sur
mapId 1481 (Mardum), zone 6383.
On lie desormais explicitement a la DESTINATION, via une WorldLocation
construite une fois et passee aux deux appels.
Le point de foyer du personnage affecte a ete remis en foret d Elwynn,
avec des coordonnees reprises d un homebind Alliance deja valide dans
notre base plutot qu inventees.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
|
||
|
|
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>
|
||
|
|
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>
|
||
|
|
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>
|
||
|
|
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> |
||
|
|
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> |
||
|
|
15ac8dbd7a |
Chantier Rivage brise : materiel de reference et outillage d extraction
Rien n est applique au serveur. Ce commit ne fait que persister le travail de reperage, qui vivait dans /home/ubuntu/tmp et aurait ete perdu. LE BLOCAGE. instance_template reclame pour la carte 1666 un script nomme scenario_7.2_broken_shore_intro qui n existe nulle part dans notre code -- script fantome. La table scenarios n a aucune ligne pour cette carte. Les quetes 45102 et 46734 sont donc infranchissables. RASSEMBLE depuis dufernst/LegionCore-7.3.5 (meme lignee uwow) : - AssaultBrokenShore.cpp (500 lignes) et instance_AssaultBrokenShore.cpp (308 lignes) ; - reperage de 593 placements de creatures (67 entrees) et 59 placements d objets (52 entrees) sur la carte 1666, dans le dump world du depot. NOTRE BASE possede deja les 67 modeles de creatures et les 52 modeles d objets -- aucun manquant. Elle possede aussi les repliques francaises de Vol jin (90708) et Sylvanas (90709), qui n ont ni spawn ni script. DECISIONS DE TRANSPOSITION etablies sur donnees, pas supposees : - spawnMask 4096 = 2^12 -> spawnDifficulties '12', la difficulte 12 etant « Normal Scenario » d apres Difficulty.db2 du build 7.3.5.26972 ; - GUID renumerotes au-dessus de nos maxima (290000114 / 210120986) ; - huit colonnes de la reference sans equivalent chez nous, abandonnees. DEPENDANCES DECOUVERTES : 180 des 593 creatures ont MovementType 2 et suivent donc des chemins a extraire aussi ; 12 portent un AiID renvoyant a une table propre au coeur de reference, comportement a refaire. PIEGE CONSIGNE dans le README : le premier extracteur renvoyait zero ligne, ce qui aurait fait conclure a tort que la reference etait vide. Les instructions insert du dump s etalent sur plusieurs lignes. C est un controle sur cas positif connu qui a revele le bug. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> |
||
|
|
1507d1084d |
Brasserie : les vermifuges s accumulaient sans aucune limite
Signale en jeu : « il y a beaucoup trop de Cognedur et de Sautilleur, c est totalement anormal », et plus tot « les lapins bouclent ». Le script d instance appelle DoAction toutes les 12 a 14 secondes, EN BOUCLE, tant que l etat de Hoptallus n est pas SPECIAL -- c est-a-dire tant qu il n a pas jailli de son tonneau. La boucle demarre dix secondes apres la creation de l instance. Chaque passage invoquait 3 a 4 Sautillons et 1 a 2 Sautilleurs, sans AUCUNE limite et sans qu aucun joueur ait besoin d etre present. Consequence : pendant qu on affronte Ook-Ook, a 105 m de la (distance mesuree entre les deux spawns), la salle des tonneaux se remplit toute seule. Sur vingt minutes de donjon, de l ordre de quatre cents creatures vivantes accumulees. En jeu officiel ces vermifuges sortent quand le joueur CASSE les tonneaux. Faute de cette mecanique, on garde le minuteur mais on lui pose deux garde-fous : aucune invocation si aucun joueur n est a 60 m (portee choisie pour couvrir la salle sans jamais atteindre l arene d Ook-Ook, mesuree a 105 m), et vague sautee au-dela de 20 vermifuges vivants. summons suit deja les invocations vivantes. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> |
||
|
|
7f8cdd2d4b |
Scenarios : la verification de l etape doit etre purement lectrice
Correctif du commit precedent, qui FAISAIT PLANTER LE SERVEUR.
Il appelait CheckCompletedCriteriaTree sur l arbre racine. Enchainement
du debordement de pile (SIGSEGV, vidage de 389 Mo contre 120 Mo en temps
normal) :
feuille achevee -> Scenario::CompletedCriteriaTree(feuille)
-> CheckCompletedCriteriaTree(racine)
-> operateur ALL : parcourt les enfants
-> CheckCompletedCriteriaTree(enfant)
-> enfant complet ET absent de _completedCriteriaTree
-> CompletedCriteriaTree(enfant) ... et on reboucle.
Le garde anti-reentrance existe pourtant (CriteriaHandler.cpp:1109),
mais l insertion dans _completedCriteriaTree se fait dans
CriteriaHandler::CompletedCriteriaTree -- que cette surcharge ne
rappelle jamais. L arbre n est donc jamais enregistre et le garde ne se
declenche pas.
On se contente desormais de LIRE la progression via IsCompletedCriteria,
en parcourant l arbre avec WalkCriteriaTree, sans jamais repasser par le
moteur d evaluation. Plus aucun effet de bord, donc plus de reentrance.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
|
||
|
|
85b0251bc1 |
Scenarios : le premier critere achevé cloturait toute l etape
Signale en jeu, capture a l appui : a la Brasserie brune d Orage, la liste des trois boss disparaissait entierement des qu Ook-Ook tombait, au lieu de cocher 1/1 et de conserver les deux autres. Le scenario 537 n a qu UNE etape (972), dont l arbre de criteres 36317 porte trois feuilles : 36318 Ook-Ook, 36319 Hoptallus, 36320 Yan-Zhu. CriteriaMgr::LoadCriteriaList attribue l etape via GetEntry, qui REMONTE la chaine des parents jusqu a trouver une correspondance -- chaque feuille herite donc de l etape 972. Et le moteur n evalue que les feuilles : GetCriteriaTreesByCriteria ne renvoie que les arbres portant directement le critere, jamais la racine. Resultat : la premiere feuille achevee marquait l ETAPE ENTIERE terminee. CompleteStep ne trouvait alors aucune etape suivante, IsComplete() repondait oui, et le scenario etait cloture des le premier boss. On verifie desormais l arbre RACINE de l etape avant de conclure. Un garde naif sur « tree doit etre la racine » ne conviendrait pas : la racine n etant jamais transmise ici, l etape ne s acheverait alors JAMAIS. CheckCompletedCriteriaTree pouvant rappeler cette fonction avec la racine, on relit l etat de l etape ensuite -- sans quoi CompleteStep serait execute deux fois et la quete de recompense octroyee en double. Correctif dans le moteur partage : il vaut pour tous les scenarios dont une etape porte plusieurs criteres. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> |
||
|
|
8238ca0925 |
Brasserie : l instance n enregistrait jamais rien
Signale en jeu : « le donjon semble avoir declenche le done total au
1er boss, je n ai plus la liste des autres boss a tuer ».
La chaine de sauvegarde etait construite par une methode Save() qui
n etait APPELEE NULLE PART. Le tampon SaveDataBuffer restait donc vide,
et InstanceScript::SaveToDB abandonne des que la chaine est vide :
std::string data = GetSaveData();
if (data.empty())
return;
Ni l etat des boss ni le masque des rencontres accomplies n atteignaient
la base. Constate directement : completedEncounters = 0 et data = '' sur
l instance 3 apres un boss tue.
Second defaut cumule : Save() n ecrivait pas l en-tete « S S B » que
Load() exige pour accepter la chaine. Meme appelee, la relecture aurait
echoue -- la progression aurait ete perdue a chaque rechargement.
GetSaveData() construit desormais la chaine lui-meme, en-tete compris
(motif habituel de TrinityCore), ce qui supprime le tampon et Save().
SetBossState declenche aussi une sauvegarde : auparavant seule la mort
d un hozen en provoquait une, via SetData.
Verifie au passage, et ecarte : les 7 lignes instance_encounters ajoutees
sont bien chargees (389 -> 396 au demarrage), le drapeau DUNGEON_BOSS est
pose dynamiquement au chargement et IsDungeonBoss le relit correctement,
et DifficultyID 0 est bien etendu a toutes les difficultes de la carte.
A noter : Yan-Zhu the Uncasked (59479) n a aucun spawn sur la carte 961.
Uncle Gao (59074) est present, donc l invocation par evenement reste
plausible -- a verifier quand le donjon sera jouable jusque-la.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
|
||
|
|
b0174ab55f |
Brasserie : ligne de vue refusee a bout portant dans l arene d Ook-Ook
Signale en jeu : « Paume du tigre » et les autres attaques de melee refusees sur Ook-Ook avec « cible hors du champ de vision ». Meme defaut qu au Temple du Serpent de jade juste au-dessus. MESURE PAR SONDE. Sur 17 echecs releves, 13 sont LEGITIMES : Ook-Ook depuis son perchoir (Z ~161,8, sol a 162,63) vers un joueur dans l arene (Z ~147), a 23-26 m -- il y a un plancher entre les deux. Les 2 autres ne le sont pas : Ook-Ook (-756,26 1353,21 146,97) -> joueur a 4,38 m joueur (-757,19 1356,00 147,06) -> Ook-Ook a 2,93 m Les deux extremites reposent sur le sol de l arene, a la meme altitude que le plancher sous leurs pieds, et l echec se produit DANS LES DEUX SENS. A trois metres sur un sol plat, une ligne de vue ne peut pas echouer legitimement. BORNES MESUREES. Tranche d altitude etroite (145-149) : le rez-de- chaussee est un plan unique (Z 146,6 a 147,5 sur 189 spawns), ce qui exclut le perchoir et preserve les 13 echecs legitimes. Rayon de 15 m autour du centre d arene : la repartition des spawns donne 6 creatures a moins de 10 m, AUCUNE entre 10 et 20 m, puis 46 au-dela -- ce vide est le mur de l arene. On s arrete avant les salles voisines pour ne pas laisser les monstres se voir a travers les cloisons. RESERVE ASSUMEE : deux echecs mesures seulement, la ou le correctif du Temple s appuyait sur trente-neuf. Bornes volontairement serrees. Egalement dans ce lot : - PV du hozen ivre bornes a 1 minimum. La sonde a montre que le calcul etait sain (pvMax=285568 -> 28556) : mon hypothese du zero etait FAUSSE. Le garde reste, mais le cadavre qui frappe n est pas explique. - Sonde CADAVREDBG conservee : elle journalise toute creature infligeant des degats alors qu elle est morte ou a zero PV. Elle attrapera le cas tout seule s il se represente. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> |
||
|
|
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> |
||
|
|
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> |
||
|
|
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>
|
||
|
|
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> |
||
|
|
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> |
||
|
|
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> |
||
|
|
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> |
||
|
|
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> |
||
|
|
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> |
||
|
|
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>
|
||
|
|
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>
|
||
|
|
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. |
||
|
|
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.
|
||
|
|
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. |
||
|
|
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. |
||
|
|
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. |
||
|
|
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. |
||
|
|
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. |
||
|
|
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. |
||
|
|
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. |
||
|
|
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. |
||
|
|
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. |
||
|
|
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. |
||
|
|
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. |
||
|
|
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. |
||
|
|
6a11a9deb0 | Correctif du fichier SQL : les accents graves avaient ete manges par le shell | ||
|
|
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. |
||
|
|
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. |
||
|
|
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. |
||
|
|
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. |