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>
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>
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>
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>
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>
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>
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>
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>
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>
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
« 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.
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.
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.
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.
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.
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>
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>
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>
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>
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>
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>
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>
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>
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>
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>
Complete mardum_fr_broadcast.sql. Ces lignes de creature_text ne portent
aucun BroadcastTextId : le pont ne pouvait rien pour elles et aucune
traduction officielle nexiste.
Couverture finale des cartes 1481 et 1468 :
repliques scriptees 142 / 142
options de gossip 15 / 15
quetes 42 / 42
Les deux lignes contenant du balisage dinterface (chemin dicone, lien de
sort) sont traitees par substitution ciblee sur loriginal, pour ne toucher
quaux mots. Rechargeable a chaud, aucun redemarrage requis.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Le corps des dialogues, les options de gossip et une partie des repliques
scriptees de Mardum et de la Vigie brisee passent par 57 textes diffuses
qui navaient AUCUNE traduction, dans aucune langue.
Sources officielles ecartees par verification : absents du BroadcastText.db2
du client (3869 entrees seulement), absents de wago.tools pour tous les
builds, non exposes par Wowhead (broadcast-text= renvoie 404), absents des
bases de reference. Ces 55 traductions sont donc redigees, dans la
terminologie francaise officielle du jeu.
Mecanisme verifie : HandleDBQueryBulk serialise lenregistrement via
store->WriteRecord(id, GetSessionDbcLocale(), ...). Les chaines localisees
etant chargees au boot, un redemarrage est requis - et le client doit vider
son cache, ayant deja memorise la version anglaise.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Quete 38766 (Avant detre submerges) bloquee : le credit 106003 accorde par
npc_doom_commander_beliash netait jamais attribue. Beliash et Fel Lord Caza
portaient un ScriptName MAL ORTHOGRAPHIE (npc_mardum_doom_commander_beliash,
npc_mardum_fel_lord_caza) qui nexiste nulle part dans le core, et ce core
ne signale pas les ScriptName inconnus.
Ayant vu le defaut se repeter, remontee de tous les credits accordes par
zone_mardum.cpp : trois blocages supplementaires attendaient sur la suite
de la campagne (38728 La Cle, 39495 Hidden No More, 38727 Halte au
bombardement). Tous corriges ici.
Innocuite verifiee : les SmartAI de Beliash et Caza sont des sous-ensembles
stricts de leurs IA C++ ; tous les autres etaient totalement inertes.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Quete 39049 (Loeil rive sur lobjectif) bloquee : tuer lInquisiteur Baleful
(93105) naccordait aucun des deux credits requis (96159 et 105946). LIA
npc_inquisitor_baleful les accorde et apprend le Faisceau incandescent,
mais le template avait ScriptName vide.
Audit du fichier zone_mardum.cpp : 29 scripts declares, 12 seulement
rattaches. Ce patch en lie 6 - ceux dont la liaison ne remplace aucun
comportement existant. Les 5 autres sont les recruteurs de compagnons de
la quete Cry Havoc, qui aurait bloque plus loin.
Reste a arbitrer (remplacerait un SmartAI actif) : 94410, 99915, 93221,
96441 - ces deux derniers portant un ScriptName mal orthographie qui ne
pointe sur rien.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Seule quete de la campagne chasseur de demons sans ligne frFR sur les 42
des cartes 1481 et 1468. Textes officiels releves sur Wowhead FR.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Les accents graves de len-tete avaient ete interpretes par le shell lors
de la creation du fichier, supprimant deux passages.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Extraction des DB2 frFR du client (mapextractor -e 2 -l frFR) et import des
chaines absentes de broadcast_text_locale. Documente aussi la limite
decouverte : le client ne stocke que 3869 entrees localement, les dialogues
Legion (dont toute la campagne DH) nont de traduction dans aucune langue.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Cinq balises invisibles referencees par boss_asaad.cpp etaient absentes de
la base (463870 emetteur mobile, 463871-3 marqueurs de sommet, 463874 ancre
des faisceaux finaux). Entrees propres au core, inexistantes aussi dans la
base officielle 7.3.5. Les appels etant correctement gardes, aucun crash :
les faisceaux etaient simplement sautes en silence et la rune ne sest
jamais affichee.
Creees par clonage de 46387 Storm Target. Verifie au prealable que le
traceur 46492, lancre 46387 et les 4 sorts de faisceau (86981, 86921,
86923, 86925 dans Spell.db2) etaient bien presents.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Signale par un joueur, reproduit 2 fois (SIGSEGV 17/08 22:09 et 22:15).
JustDied() invoque le Slipstream 45457 pour ouvrir la voie vers la 2e
plateforme, puis pose son drapeau de dialogue sans verifier le retour.
Lentree 45457 nexiste dans aucune base (ni la notre, ni TDB 7.3.5) :
SummonCreature renvoie nullptr et le dereferencement tue le worldserver
dans Unit::Kill a chaque mort du boss.
- SQL : creation de lentree 45457 par clonage de 45455, avec le script
npc_slipstream_two deja present et enregistre dans le core.
- C++ : controle du nullptr sur les deux occurrences du motif (Altairus
et Grand Vizir Ertan) pour quune donnee manquante ne puisse plus
faire tomber le serveur.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Aysa Cloudsinger (60566), receptrice de la quete et donneuse de la suivante
(30987 Rejoindre lAlliance), na aucun spawn - pas meme dans la base mondiale
officielle TrinityCore 7.3.5. La branche Horde (Ji 60570) est complete, la
branche Alliance nexiste pas : quete bloquee pour tout pandaren Alliance.
Spawn place au POI client de la quete (-9118, 392), le meme relevé qui
correspond au metre pres au spawn de Ji cote Horde. Phase 1164 transposee
sur laire 12 (Elwynn) avec les conditions Durotar, quete 30987 a la place
de 31012.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
curhealth=0 en base + RegenHealth=0 au template => SetSpawnHealth() appelle
SetHealth(0) sur une creature pourtant vivante : le client laffiche en
cadavre pendant que le serveur continue sa patrouille. Alignement sur
lentree jumelle 60770, deja a RegenHealth=1.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Le mecanisme nexistait pas : les 2 credits (59946/59947) etaient definis mais
rien ne les accordait, les portes sont des gameobject type 0 (non cliquables,
ouverture par script uniquement) et les compagnons censes les ouvrir (Aysa,
Ji, Jojo) nont aucune IA. Sy ajoutent des doublons dobjets empiles (version
ouverte + fermee en PhaseId 0) que le phasing retail separe - do le symptome
une porte ouverte, lautre bloquante et inerte. Bug connu des serveurs prives.
Correctif : un declencheur invisible dedie (entree custom 900000, SmartAI)
devant chaque porte accorde le credit et ouvre la porte a lapproche (12m).
Entree custom plutot que lInvisible Stalker 15214 partage, pour ne pas
ajouter SmartAI a un template utilise partout ; scripts attaches aux GUID
pour differencier les deux portes. Valide en jeu.
CharTitles.db2 (7.3.5) ne contient aucun titre « Mercenaire » : 364 entrees,
ID max 522, MaskID max 373. On cree donc l entree custom 600 / MaskID 380
dans la table `char_titles` de la base hotfix, poussee au client par une
ligne `hotfix_data` (TableHash CharTitles = 0x85DF9E8E).
PlayerBotMgr::ApplyBotTitle() accorde puis selectionne ce titre a chaque
connexion de bot, depuis OnPlayerBotLogin(). Un bot ne peut donc pas s en
defaire, et les vrais joueurs les reconnaissent d un coup d oeil.
Cle de configuration pbottitle (600 par defaut, 0 = aucun titre force).
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Le sous-titre est retire. Surtout, rank 3 ne suffit pas a masquer le niveau :
le contour dore vient de Classification (rank), le « ?? » a la place du niveau
vient de Flags[0] (type_flags), envoye separement dans la reponse de requete
creature. type_flags = 4 (CREATURE_TYPE_FLAG_BOSS_MOB) ajoute.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Le modele 74465 est un portail de taille reglementaire, trop imposant pour un
PNJ de service. Demi-echelle.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>