Commit Graph

178 Commits

Author SHA1 Message Date
SylvaniaCore deploy c47aedbfd7 La liberte a portee dailes : le donneur est le champion du joueur
Troisieme et derniere correction de lattribution. Indication de
lutilisateur en jeu, qui tranche.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    WHERE '%s' REGEXP cname

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

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

Le message est desormais echappe et borne a 255 caracteres.

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

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

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

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

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

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

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

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

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

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-18 23:08:07 +02:00
SylvaniaCore deploy 1e1a7d8957 BG BotFill : vague de sortie de cimetiere apres resurrection
Doctrine PvP : repartir seul de son cimetiere revient a nourrir l adversaire
un par un. Les bots ressuscites repartaient isolement et se faisaient cueillir
en chemin. Un bot patiente desormais au cimetiere jusqu a ce que trois allies
soient a portee, au maximum huit secondes. Il repart immediatement s il est
attaque, si un ennemi pousse jusqu au cimetiere, ou s il porte un drapeau.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-18 09:59:50 +02:00
SylvaniaCore deploy 537e6df7cd BG BotFill : laisse tactique autour de l objectif + escorte du porteur
1. Laisse : un bot ne se laisse plus entrainer loin de son objectif par un
   fuyard. Au-dela de 50 m du point a tenir la cible est fortement
   deprioritisee, sauf le porteur de drapeau qu il faut poursuivre partout.
   Sans cette regle les defenseurs desertaient leur base des le premier
   ennemi croise, defaut classique des IA de champ de bataille.
2. Escorte a Chanteguerres : jusqu a trois allies deja proches (60 m) collent
   le porteur pour intercepter ses poursuivants. L Oeil du cyclone avait deja
   ce comportement, Chanteguerres laissait le porteur rentrer seul.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-18 09:46:16 +02:00
SylvaniaCore deploy 7987f07d48 Tyranna : fiabilise le credit trouvez le chemin vers le bas (quete 38728)
Complement de c25c1305. Le credit 101760 netait accorde que dans
DamageTaken, au coup fatal, aux seuls joueurs figurant a cet instant dans
la liste de menace de Tyranna. Dans un combat ou quatre PNJ compagnons
frappent aux cotes du joueur, cette conjonction rate - constate en jeu :
le joueur tuait bien Tyranna, ramassait la Cle de voute (qui ne tombe que
sur son cadavre), et restait bloque sur ce seul objectif.

La cause exacte de lechec na pas pu etre determinee apres coup : trois
conditions doivent etre reunies simultanement (instance de degats letale,
liste de menace non vide, quete en cours) et rien dans les donnees ne dit
laquelle a manque. Do le choix de supprimer la dependance plutot que de
la diagnostiquer.

Le credit est desormais aussi accorde dans JustDied, par proximite (100 m)
et sans condition de menace, sur le modele du script de lInquisiteur
Baleful. Lancienne voie est conservee : les deux sont idempotentes.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-18 09:41:53 +02:00
SylvaniaCore deploy c25c130506 Quete 38728 (La Cle) : objectif trouvez le chemin vers le bas inatteignable
Signale en jeu : le joueur descend, trouve la Cle de voute sargerite,
clique dessus, rien ne se passe - et la quete reste bloquee.

Le troisieme objectif (credit 101760, Find the way downstairs) netait
accorde que par le script de Tyranna, dans DamageTaken, aux seuls joueurs
presents dans sa liste de menace au coup fatal. Deux facons detre bloque :
le script non rattache au moment du kill (cas rencontre), ou le coup fatal
porte par Kayn. Une fois en bas, plus aucun recours sur place : il faut
remonter et retuer le boss.

Lobjectif sappelle pourtant trouvez le chemin vers le bas et la cle se
trouve justement en bas. Le gameobject 245728 laccorde desormais aussi,
en plus du credit 100651 qui appartient a la quete suivante (38729).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-18 01:46:53 +02:00
SylvaniaCore deploy b1c0676a9b README: remerciements a ArgusCore (FlyingPhoenix)
ArgusCore (Trion-Control-Panel/ArgusCore) est une reference majeure pour
SylvaniaCore, notamment sur le moteur, la couche reseau et les mecaniques
de classes en 7.3.5. Ajoute en bonne place dans la section remerciements,
avec le lien vers le depot et vers le profil de son auteur.
2026-08-18 01:32:02 +02:00
SylvaniaCore deploy a1f146653e README: le Discord est celui des contributeurs, pas des joueurs
Le lien discord.gg/qmQBXbuXkx sert a la coordination du developpement du
core, pas au royaume. Bandeau deplace de la section Rejoindre le royaume
vers Contribuer, libelle des badges passe a Espace contributeurs et
precision explicite que ce nest pas le Discord des joueurs.
2026-08-18 01:28:58 +02:00
SylvaniaCore deploy 723b200dbe Quete 39515 (A moi la vengeance) : les 5 PNJ ne reagissaient pas
Signale en jeu : cliquer sur loption de dialogue dAllari, Cyana, Kayn,
Korvas ou Mannethrel ne produisait rien.

Cry Havoc existe en DEUX versions strictement jumelles - memes cinq
objectifs, meme donneur (Kayn 93127) - une par specialisation :
  39516 Semer la devastation  (Devastation)
  39515 A moi la vengeance !  (Vengeance)

Le script ne testait que 39516, en six endroits. Pour un joueur ayant
choisi Vengeance, HasQuest renvoyait faux et chaque handler sortait
immediatement. Le script de la Vigie brisee gere pourtant bien ses propres
variantes (_HA/_HH/_VA/_VH, _H/_V, _DMG_SPEC/_TANK_SPEC) : loubli est
propre a Mardum.

Verification systematique faite : en croisant toutes les quetes codees en
dur dans les deux scripts DH avec la liste des quetes partageant une
signature dobjectifs identique, Cry Havoc est la SEULE de Mardum a avoir
une jumelle non geree.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-18 01:25:53 +02:00
SylvaniaCore deploy 79190bef41 README: badge Discord du royaume
Badge Discord ajoute dans la rangee den-tete et bandeau for-the-badge
dans la section Rejoindre le royaume, pointant sur linvitation
discord.gg/qmQBXbuXkx.
2026-08-18 01:22:24 +02:00
SylvaniaCore deploy 764892f4be README: rebrand complet en SylvaniaCore
Reecriture du README en francais autour de SylvaniaCore : presentation du
royaume et de la philosophie blizz adaptatif, tableau des modules propres
(PlayerBots, Siege des Capitales, Mercenaires, localisation frFR), URLs de
clone et dissues repointees sur BlaMacfly/SylvaniaCore, section de
remerciements a DestinyCore/TrinityCore, mention legale Blizzard.

Les badges de build restent ceux de lamont, explicitement etiquetes comme
tels (le fork na pas de runs GitHub Actions). Les noms internes du code
(cibles CMake, chemins) sont volontairement inchanges.

Branche destinycore renommee en sylvaniacore.
2026-08-18 01:15:11 +02:00
SylvaniaCore deploy 5c72317b6f README: logo SylvaniaCore et en-tête du projet
Ajout du logo (.github/assets/sylvaniacore-logo.png) en en-tête centré,
titre SylvaniaCore avec mention du fork DestinyCore, badges stars/forks
repointés sur BlaMacfly/SylvaniaCore, et rappel du logo en pied de page.
2026-08-18 01:11:18 +02:00
SylvaniaCore deploy 81b37487dd Quete 40051 (Secrets gangrenes) : le choix de specialisation ne validait rien
Signale en jeu : le tome ouvre bien le choix, on selectionne Devastation ou
Vengeance, mais la quete reste incomplete.

Trois defauts :
1. Le script implementait OnCompleteQuestChoice, un hook declare dans
   ScriptMgr mais appele DE NULLE PART. Le seul hook invoque par le core
   est OnPlayerChoiceResponse (QuestHandler.cpp). La methode etait donc du
   code mort - preuve mesuree en base : le joueur navait pas appris le sort
   200749 et son activeTalentGroup restait a 0.
2. Aucun credit de quete nulle part, alors que 40051 exige lentree 99071.
3. La branche Devastation nactivait pas la specialisation, contrairement a
   celle de Vengeance : asymetrie qui laissait le joueur sans spe.

AssertEntry remplace par LookupEntry avec garde, pour ne pas abattre le
serveur si un identifiant de specialisation manquait.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-18 01:06:50 +02:00
SylvaniaCore deploy c9f4c87e61 PlayerChoice : boutons vides (choix de specialisation chasseur de demons)
Signale en jeu : le tome des secrets gangrenes ouvre le choix de
specialisation, la question saffiche mais les deux boutons sont vides.

Trois defauts cumules dans Player::SendPlayerChoice :
1. Le filtre exigeait une recompense avec un sort VALIDE pour quune
   reponse soit envoyee. Le choix 231 (Devastation / Vengeance) a
   SpellID=0 : les deux reponses etaient silencieusement ecartees.
2. displayPlayerChoice.Responses etait redimensionne AVANT le filtrage,
   laissant une entree vide par reponse ecartee - do les boutons vides.
3. Reward->SpellID etait dereference sans controle alors que Reward peut
   etre nul, comme le montre le test plus bas dans la meme fonction :
   un plantage en attente pour toute reponse sans ligne de recompense.

Correctif general, valable pour tous les choix, pas seulement celui-ci.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-18 00:56:55 +02:00
SylvaniaCore deploy b671ae3c10 Campagne DH : traduction FR des 119 repliques scriptees restantes
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>
2026-08-18 00:31:41 +02:00
SylvaniaCore deploy bec6968b81 Campagne DH : traduction FR des 55 textes diffuses de Mardum
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>
2026-08-18 00:26:53 +02:00
SylvaniaCore deploy d0380580f4 Mardum : second lot de liaisons de scripts (11 entrees)
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>
2026-08-18 00:15:46 +02:00
SylvaniaCore deploy 8ce525b9f1 Mardum : rattache 6 IA C++ ecrites mais jamais liees aux PNJ
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>
2026-08-18 00:06:51 +02:00
SylvaniaCore deploy 4d9029e3d2 Quete 38669 (Notre dernier espoir) : traduction frFR officielle
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>
2026-08-17 23:52:20 +02:00
SylvaniaCore deploy 8974a7b115 Restaure len-tete tronque du patch de traductions frFR
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>
2026-08-17 23:42:57 +02:00
SylvaniaCore deploy e9eaa54adf Traductions frFR extraites du client 7.3.5 (+907 broadcast_text)
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>
2026-08-17 23:41:47 +02:00
SylvaniaCore deploy 1fcbf699a7 Cime du Vortex : triangle de runes dAsaad inoperant
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>
2026-08-17 22:57:12 +02:00
SylvaniaCore deploy fc00afa703 Cime du Vortex : crash serveur a la mort dAltairus
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>
2026-08-17 22:49:08 +02:00
SylvaniaCore deploy 2e7a255918 Quete 31450 (Un nouveau destin) : implementation de la branche Alliance
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>
2026-08-17 12:04:23 +02:00
SylvaniaCore deploy 11bf738554 Horde Druid 60896 : fin des cadavres ambulants sur lIle Vagabonde
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>
2026-08-17 11:32:14 +02:00
SylvaniaCore deploy 49e3c727d6 BG BotFill : doctrine du porteur de drapeau + fin du spam de log par tick
1. Un porteur de drapeau ne selectionne plus de cible : il court au but
   pendant que son escorte le protege (doctrine PvP). Auparavant il engageait
   le premier ennemi croise et mourait au milieu du terrain avec le drapeau.
2. Retrait de 4 traces PBOT heritees de l upstream, emises a chaque tick de
   chaque bot (80 bots en Alterac) : formatage et ecriture disque inutiles a
   chaque passage, et l une d elles dereferencait GetBattleground() sans
   controle de nullite.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-17 11:22:03 +02:00
SylvaniaCore deploy 0bb8fb7d90 BG BotFill : doctrine de ciblage PvP en champ de bataille
Le bot prenait l ennemi le plus bas en vie sous 80 %, sinon un ennemi AU
HASARD : aucun feu concentre, soigneurs ennemis jamais inquietes, porteur de
drapeau ignore. Les cibles sont desormais notees selon la doctrine PvP de
champ de bataille (Vanilla -> Legion) :
  porteur de drapeau  +1000  (objectif du match)
  soigneur ennemi     +400   (un soigneur libre rend le combat ingagnable)
  cible blessee       +3 par point de vie manquant (achever plutot qu etaler)
  allie deja au contact +60 chacun (feu concentre)
  distance            -1 par metre
  hors ligne de vue   -250
Detection du soigneur par classe ET specialisation (un paladin protection
n est plus traite comme un soigneur) ; le feu concentre se lit sur la liste
des attaquants de la cible, sans recherche couteuse.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-17 11:17:30 +02:00
SylvaniaCore deploy beaf2ff164 Quete 29792 (Voues a la grandeur) : implementation de louverture des portes
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.
2026-08-17 11:10:03 +02:00
SylvaniaCore deploy 0f880f0f9b IA de classe : recalibration Legion des huit classes restantes
Suite de la recalibration commencee par le mage. Meme methode : chaque valeur
a ete verifiee presente dans character_spell chez les bots de niveau 110 du
serveur, la base faisant foi plutot qu une documentation externe.

  Guerrier    12 constantes    Paladin      8
  Chaman      11               Priest       8
  Druide       9               Voleur       6
  Chasseur     5               Demoniste    3

Cas notable du guerrier : Frappe mortelle et Broyeur de colosse, le coeur de la
rotation Armes, n avaient aucune constante dans l IA. Deux constantes devenues
mortes ont ete repointees dessus.

Le chaman Restauration recupere toute sa panoplie de soins, qui etait
integralement inoperante : Vague de soins, Salve de soins, Chaine de soins,
Vague de rappel, Pluie de soins, Totem de maree de soins, Totem de lien
spirituel. C est la condition pour que les soigneurs de la horde du siege
tiennent leur role.

Le pretre Ombre retrouve Attaque mentale, Toucher vampirique, Eruption du Vide
et Forme d ombre ; le paladin Vindicte Lame de justice, Verdict du templier et
Tempete divine ; le druide Equilibre Courroux solaire, Frappe lunaire et
Poussee d etoiles, et le Gardien Fourrure de fer et Regeneration frenetique.

Total sur les neuf classes : 49 constantes recalibrees.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-16 23:23:40 +02:00
SylvaniaCore deploy b98cc56745 IA de classe : recalibration Legion du mage, et inventaire des neuf classes
Les IA de BotClassAI resolvent leurs sorts par FindMaxRankSpellByExist. Quand le
bot ne connait pas l identifiant, la constante vaut 0 et toutes les branches qui
en dependent sont sautees en silence. Mesure sur les bots 110 du serveur : entre
80 et 93 pour cent du repertoire de chaque IA est du code mort, les identifiants
datant d une version bien anterieure du jeu. Le chaman connait 3 des 43 sorts
qu il reclame, le mage 4 sur 46.

Mage recalibre en premier, sept constantes : Trait de givre, Lance de glace,
Bourrasque, Blizzard, Orbe de givre, Barriere de glace, Frappe de feu. Les
valeurs viennent de la base du serveur et non d une documentation : ce sont les
sorts que les mages 110 possedent reellement.

sylvania/RECALIBRATION-IA-CLASSES.md consigne la methode et le kit Legion
verifie present pour les neuf classes, pour ne pas refaire ce releve.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-16 23:16:47 +02:00
SylvaniaCore deploy 6b89200c47 Siege des Capitales : composition de la horde par roles
La horde etait recrutee sans regard pour les roles : n importe quelle classe,
avec la specialisation que le personnage portait deja. Les IA de classe savent
pourtant distinguer les roles - BotPaladinAI soigne en Sacre, BotPriestAI hors
Ombre, BotShamanAI en Restauration - mais cette logique ne servait a rien
puisque la specialisation n etait jamais imposee.

Le recrutement vise desormais des quotas, nouvelles cles siege_tank_pct et
siege_healer_pct (10 et 20 par defaut, somme plafonnee a 60). Les soigneurs et
les tanks sont engages en premier : sans eux la horde fond avant le trone.
FindSpecIndexForRole interroge ChrSpecialization pour trouver la specialisation
que la classe doit prendre, et le re-level la lui impose via parameter3.

Les specialisations d index superieur a 2 sont ecartees : elles sont hors de
portee du re-level, qui refuse talent > 2. Cela concerne la Restauration du
druide, dont l IA de classe attend de toute facon un druide a trois
specialisations, calibrage d avant Legion.

L imposition de la specialisation passe par Player::ActivateTalentGroup, sur son
propre tick du re-level. Une premiere tentative ecrivait
PLAYER_FIELD_CURRENT_SPEC_ID a la main pendant que stats et auras etaient
recalculees, et provoquait un debordement de pile.

Verifie en conditions reelles, assaut a 50 bots : apparition de guerriers
Protection et de druides Gardien en tank, de chamans Restauration en soigneur,
sept talents par bot et par specialisation, aucun plantage, progression 29 a 30
sur 30.

Reste a affiner : le quota de soigneurs n est pas toujours atteint faute de
comptes disponibles dans les classes soignantes au moment du recrutement.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-16 23:08:23 +02:00
SylvaniaCore deploy 5aeeb91c52 PlayerBot : ordres stop et summon operants, rotation des mercenaires
Trois defauts distincts, tous verifies en jeu par sondes temporaires puis par
comparaison des positions en base.

1. L ordre « stop » n arretait rien. Le suivi est un generateur MoveFollow pose
   sur le MotionMaster ; ClearMovement() se contente d appeler StopMoving() et
   le generateur, toujours en tete de pile, relançait la poursuite au tick
   suivant. ProcessStopCommand vide desormais la pile de mouvement.

2. Le teleport d un bot aboutissait cote serveur - positions identiques en base
   apres un « summon » - mais les clients continuaient de l afficher a son
   ancienne place : l etape finale diffuse un paquet portant un opcode CLIENT
   (CMSG_MOVE_FALL_LAND) que les clients voisins ne savent pas lire. L objet est
   maintenant reconstruit chez les joueurs alentour, et le MotionMaster vide a
   chaque acquittement, comme le fait mod-playerbots dans HandleTeleportAck.

3. Cote module, l invocation posait un TeleportTo direct : meme cause, meme
   effet, le mercenaire semblait n arriver jamais au portail. Elle passe
   desormais par l ordre « summon » de l IA de groupe, au tick qui suit l entree
   dans le groupe - le temps que l IA reconnaisse son maitre.

Enfin, FindCandidate retournait le premier compte bot eligible d une carte
ordonnee par identifiant : c etait invariablement le meme mercenaire. Tous les
candidats sont desormais collectes puis tires au sort, en ligne comme hors
ligne, un seul personnage par compte pour ne pas biaiser le tirage.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-16 15:30:31 +02:00
SylvaniaCore deploy 70e47be8b6 PlayerBot : la monture d un bot de groupe calque celle de son maitre
Le core ne savait que monter, jamais descendre : TryUpMount() sortait des la
premiere ligne si l aura de monture etait deja posee, et rien n appelait
Dismount() hors lancement de sort. Un mercenaire recrute alors qu il galopait
sur le terrain restait donc en selle indefiniment, y compris derriere un maitre
a pied.

UpdateMountState() remplace TryUpMount() dans le tick et traite les trois cas :
maitre a pied, le bot descend (RemoveAurasByType, la monture portee pouvant
venir de l IA de terrain et ne pas etre m_UseMountID) ; maitre monte au sol,
monture terrestre ; maitre en vol, monture volante.

Le vol passe par BotAIFly::UpdateFly, qui etait neutralisee par un return sec en
tete de corps. Elle est retablie : c est le seul code qui fasse suivre un bot en
trois dimensions, et BotGroupAI est son unique appelant - aucun autre mode d IA
n est touche.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-16 13:47:30 +02:00