Le harnais bot a intercepte 3 crashs avant tout joueur : mon renommage de la passe 4
(GetBossSaveData -> GetSaveData, la suggestion du compilateur) avait transforme
l override GetSaveData en appel recursif infini -> stack overflow des qu une instance
1676 se cree. Fix racine : suppression des overrides GetSaveData/Load du module,
la persistance generique d InstanceScript (SetBossState) fait foi dans les deux sens.
LECON : ne jamais accepter aveuglement le did-you-mean du compilateur quand la
fonction suggeree est celle qu on est en train de definir.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
AVANT : 4 boss etaient des coquilles vides de 28-33 lignes (Hote affige, Jeune fille
de vigilance, Sassz ine, KIL JAEDEN le boss final) et AUCUN boss n etait binde en DB
(ScriptName vides sauf Goroth) -> le raid entier etait decoratif malgre 978 spawns.
APRES : module lignee uwow complet (12 161 lignes, 12 fichiers) transcrit vers nos
APIs en 7 passes de compatibilite (~880 erreurs de compilation resorbees) :
instance script complet (portes, frames, graveyards), 9 encounters scriptes,
trash/evenements, 74 bindings de sorts, ~60 ScriptName de creatures, ATs.
Ajouts CORE reutilisables (compat DestinyCoreNew, prepareront le futur port Antorus) :
- UnitAI : DoCastTopAggro, GetObjectData, hooks no-op (SpellFinishCast,
OnApplyOrRemoveAura, OnRemoveAuraTarget, OnAreaTriggerDespawn/Cast, OnInterruptCast,
IsDisableGenerateLoot, GetModifyedData)
- CreatureAI : Talk(guid), Talk(liste aleatoire), ZoneTalk
- ScriptedAI : CheckHomeDistToEvade + alias IsHeroicRaid/IsMythicRaid/IsLfrRaid/
IsNormalRaid/IsHeroicPlusRaid ; SummonList::GetCreature
- Unit : GetAnyOwner, CastSpellDelay x2 ; Creature : SetReactState(delay), StopAttack
- Map : ApplyOnEveryPlayer, IsHeroicPlusRaid ; GameObject : AddDelayedEvent (m_Events)
- Position : SimplePosXYRelocationByAngle, GenerateNonDuplicatePoints, IsLinesCross
(reecrit sans G3D::LineSegment2D, absent de notre g3dlite)
- MotionMaster : MoveSmoothFlyPath x2 ; AreaTrigger : GetRadius/SetSphereScale(no-op)/
isMoving/Despawn/GetProgressCompat ; AreaTriggerAI : IsValidTarget/CalculateSpline
Degradations douces assumees (documentees en commentaire dans le code) :
filtrage de cibles des ATs (IsValidTarget jamais appele par notre moteur), scale
dynamique des zones de Kil jaeden, conversations cinematiques, distribution de loot
personnelle, hooks d interruption/notification d aura, quelques approximations de
roles (SoloQ->ROLE_TANK) et de type de degats.
SQL : sql/sylvania/tomb_of_sargeras_bindings.sql (applique en DB).
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Inspection des cores 7.3.5 actifs en 2026 hors ArgusCore : Legion-Studios (releases
ecrasees, inexploitable), levrules (locales russes), Psychostout (dump sans historique),
mudyx/DestinyCoreNew (meme famille que nous ; ses fixes ciblent sa propre dette, notre
Nythendra est deja correcte ; NOTE : il possede des scripts Antorus/Tombe de Sargeras
qu on n a pas -> gisement de contenu futur), Titans/LegionCore-Reforged (2 fixes retenus).
Portes depuis LegionCore-Reforged 814091a (verifies buggues chez nous) :
- PathGenerator::BuildPolyPath : dans la branche farFromPoly on ne recalait QUE le point
d arrivee ; le point de DEPART restait aberrant quand l unite est au-dessus du navmesh
(debout sur un GO : quai, caisse, plateforme) -> chemins aberrants des poursuivants.
Recalage du startPoint sur son poly ajoute.
- MMapManager : budget de noeuds Detour de la navmesh query 1024 -> 2048 : les tres longs
chemins echouaient faute de budget.
Ecartes apres verification (pieges evites) : displayId 39 -> 32290 aurait CREE un bug
(nos 1216 GO display 39 spawnes = points d assise volontairement invisibles, 0 coffre) ;
locales frFR (nos 104640 noms FR >> leurs 9880, schema different) ; criteria appearance
(deja gere, 4 sites CriteriaHandler).
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Inspection des 111 nouveaux commits ArgusCore (26/07 -> 01/08). Seuls 2 bugs sur 5
candidats existaient reellement chez nous (les autres deja corrects, voir ci-dessous) :
- Bond heroique (6544) : la constante SPELL_WARRIOR_HEROIC_LEAP_DAMAGE (52174) etait
declaree mais JAMAIS castee -> le bond ne faisait aucun degat a l atterrissage.
Le champ TriggerSpell de l effet JUMP_DEST n est pas peuple dans ce client, donc on
caste explicitement. Compromis assume : part au lancement, pas a l impact exact. (32dfd577)
- Vallee d Alterac : m_CaptainBuffTimer initialise avec urand(0,4)*60 au lieu de *60000
-> buff des capitaines quasi immediat au lieu de 2-6 min. Une seule des deux occurrences
etait buguee (l initialisation), l autre etait deja correcte. (a4f5083d)
DEJA CORRECTS chez nous (verifies, rien a porter) : opcode SMSG_ACCOUNT_HEIRLOOM_UPDATE
0x25C5 (ArgusCore cite DestinyCore comme reference), constantes AV/IoC 600/300,
areatrigger_teleport a ID negatifs (notre conteneur est deja int64), map IDs des BG
(architecture differente, pas de battleground_scripts chez nous).
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Cause racine : une invocation faite par la MAP (instance->SummonCreature) n herite
d AUCUNE phase, contrairement a un summon fait par une creature. Les joueurs etant mis
en phase 169 par OnPlayerEnter, toutes les vagues et PNJ de ces 2 scenarios etaient
invisibles/intangibles => etape 1 infranchissable (joueur Argus bloque sur la map 1460).
Ce defaut avait ete trouve par le harnais bot le 26/07 et corrige dans le runner
d artefacts UNIQUEMENT ; les 2 scenarios narratifs, ecrits avant, ne l avaient jamais recu.
- Rive Brisee : helpers Summon/SummonAt centralises -> phase 169 + Z cale au sol ;
aggro forcee sur les vagues de demons (compteur d etape) ; allies non touches
- Moine Serenity s End : helper SummonPhased (phase + Z), 22 appels map rediriges
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
dc_world n est pas couverte par le backup auto (auth+characters seulement, dump
compresse ~78 Mo). Ces patchs sont la trace versionnee hors-VPS des changements
data : framework scenarios d artefact, campagne moine, intro Rive Brisee, bindings
Ring of Peace/Chi-Ji, trainers, quetes, fixes divers.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Dernier manque moine de l audit 10/07. AreaTrigger id 718 (trouve via SpellEffect.db2
effet 179 CREATE_AREATRIGGER misc[0]=718). Struct at_monk_ring_of_peace : OnUnitEnter
ejecte tout ennemi valide hors de l anneau (KnockbackFrom depuis le centre), mecanique
Legion 7.3.5 confirmee (wowhead/wowpedia : anneau 8s, ennemis entrants ejectes).
Binding : areatrigger_scripts(718) -> ~/dc-patches/ring_of_peace.sql.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- LFG: quitter la file en solo n autorise que SON propre ticket, pas celui d un autre (28b8d962)
- Calendrier: modifier un evenement ou y ajouter une invitation reserve au proprietaire
ou a un invite moderateur (helper CalendarEventEditableBy sur UpdateEvent + Invite) (0c2fed59)
Non portes (deja OK/absents chez nous) : arene join utilise deja la vraie note (pas le
bug hardcode a 1) ; Chant de Chi-Ji areatrigger DEJA implemente (at_monk_song_of_chiji).
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
PathGenerator::ValidatePathAgainstCollision() appelee en fin de BuildPointPath :
valide chaque segment du chemin MMAP contre la collision vmap (isInLineOfSight,
ModelIgnoreFlags::Nothing). Le MMAP ne modelise pas les objets fins (clotures,
barrieres) -> un chemin nav-mesh valide peut les traverser. Si un segment est bloque,
on tronque le chemin (PATHFIND_INCOMPLETE) pour que l unite s arrete devant l obstacle.
Adapte a nos APIs : _sourceUnit, isInLineOfSight 8-params, log printf, halfHeight fixe.
Skippe les chemins non-MMAP (vol/nage/raccourcis).
ARBITRAGE reversible : plus realiste mais risque de sur-troncature (PNJ qui s arretent
devant une porte/rampe M2 vue comme obstacle). A surveiller : PNJ bloques en mouvement.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Les 9 verifications de LoS de sorts dans Spell.cpp passent de ModelIgnoreFlags::M2
(ignore les doodads M2) a ::Nothing (les prend en compte). Effet : on ne peut plus
lancer de sort a travers piliers/arbres/portes qui sont des modeles M2. Nos vmaps
contiennent bien la geometrie M2 (13545 modeles .m2.vmo) donc le changement est effectif.
Couvre : cibles de chaine, CheckCast (cible+destination), CheckEffectTarget, ecorchage/cadavre.
ARBITRAGE reversible : plus Blizzlike mais risque de faux blocages sur doodads a
collision imprecise. Verifie en scenario (combat OK, 0 erreur LoS anormale). Revert =
Nothing -> M2 sur ces 9 sites si les joueurs signalent des sorts bloques a tort.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Anti-crash (adaptes a nos APIs) :
- Spell: assert dur sur cible destination -> log+skip (a00b85b2)
- SpellAuraEffects: DoT weapon-percent, caster nul -> tick a 0 (b456b7f7)
- Battleground: PlayerScores.find sans garde -> continue si absent (e875f9f4)
- VehicleHandler: 4x siege nul deref -> return (392466b1)
- LootHandler: division par zero si liste vide -> return (e8196eed)
Anti-exploit :
- PetHandler: index action bar hors bornes (OOB write) + abandon reserve au proprietaire (fec060ab)
- Guild: onglet de banque reserve au chef (2288f107) ; attribution de rang ne peut viser/donner un rang >= au sien (f94d82dc)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- PlayerBotSession : simulation de l ack de teleport PROCHE (CMSG_MOVE_TELEPORT_ACK),
debloque les .tele enchaines sur un bot (le 1er passait, les suivants restaient coinces)
- Runner artefacts, fixes issus de la passe bot in-game (7 scenarios certifies ACTIFS) :
* vagues engagees explicitement (SetReactState AGGRESSIVE + SetInCombatWithZone) :
les TempSummon de Map n aggro pas seuls -> mobs inertes sur TOUS les scenarios
* phase 169 appliquee aux invocations (alignement avec OnPlayerEnter)
* tolerance GetHeight 25->60m (Skywall : plateformes etagees, le garde-fou lachait
les vagues dans le vide) + sonde QA-PROBE etiquetee par map (visibilite/combat/pos)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- PlayerBotSession : simulation de l ack MSG_MOVE_WORLDPORT pour un bot en jeu
(IsBeingTeleportedFar) ; sans ca tout .tele name sur un bot restait bloque
- BotFieldAI : eviction hors instance gatee par la config pbotqa (harnais scenarios)
- Diagnostics QA-BOTLOG/QA-RUNLOG (login bot, holder async, cycle du runner)
- Runner artefacts : Z des spawns cale au sol via GetHeight avec repli sur l ancre,
offsets resserres (plateformes type Skywall)
- Cause racine login bots : noms generes invalides (chiffres) rejetes par
CheckPlayerName -> persos QA renommes en DB (Botqa/Botqb, compte 32)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Toutes les maps de scenario d artefact sont couvertes. Config ~/dc-patches/artifact_batch10.sql, options 54-59.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Configs data (~/dc-patches/artifact_batch1.sql) : etapes multi-zones ICC via teleports,
boss Aberration horrifiante 106669, ames 99664/116287, options 37/38 du Gardien des Artefacts.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- class_hall_artifact_choices.cpp : handler generique responseId -> quete Chosen 40xxx
pour guerrier/paladin/chasseur/pretre/DK/DH/chaman/demoniste (druide, mage, voleur,
moine gardent leurs handlers dedies)
- Ritssyn Flamescowl (104795) declenche le choix demoniste via SendPlayerChoice(245)
(aucun declencheur n existait pour cette classe)
- Data : ~/dc-patches/artifact_choices.sql (textes FR des choix, UI d etapes pour
6 scenarios d artefact deja scriptes : Ursoc/Dark Riders/Windrunners/Truthguard/
Nexus Vault/Mother Tree)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Les 3 classes spell_monk_mastery_combo_strikes(_periodic_auras/_periodic_triggers)
existaient mais n etaient jamais enregistrees dans AddSC_monk_spell_scripts
(boot log: no core script found). Enregistrement des 3 classes.
La classe principale (deja bindee sur Tiger Palm/Blackout Kick/Flying Serpent
Kick/Rising Sun Kick) applique desormais le bonus de maitrise sur les
enchainements non repetes + pilote le talent Hit Combo. Les variantes periodiques
(Fists of Fury/Spinning Crane Kick/Whirling Dragon Punch) necessitent leurs
bindings spell_script_names.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Suite a l'audit de la classe moine (3 mecaniques cassees vs Wowhead 7.3.5) :
1. Ironskin Brew (115308) ne faisait RIEN : effet unique DUMMY, buff 215479
(+35% Stagger) orphelin (reference nulle part). Nouveau script
spell_monk_ironskin_brew : applique/prolonge 215479 (cumul de duree, cap 3x).
Le calcul du Stagger (stance_of_the_sturdy_ox) lit desormais 215479 et l'ajoute
au pourcentage. -> le Brewmaster recupere sa mitigation active.
(binding via spell_script_names 115308 -> spell_monk_ironskin_brew)
2. Keg Smash (121253) executait des sorts MoP disparus (Weakened Blows,
Dizzying Haze, energize Chi 127796 absent). Remplace par la mecanique Legion :
-4 s sur la recharge des 4 breuvages. Ironskin/Purifying partagent une categorie
de charges (dedup) -> nouvel API core SpellHistory::ModifyChargeRecoveryTime ;
Black Ox/Fortifying via ModifyCooldown.
3. Combo Breaker : le proc tentait 118864 (Tiger Palm MoP, absent du client 7.3.5)
1 fois sur 2 -> proc perdu. Proc desormais toujours Blackout Kick! (116768).
Diagnostic produit lors de l'audit moine, verifie contre les donnees DB2 et
les references 7.3.5, puis deploye manuellement.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Bug (signalement #8, perso draenei): sous le niveau 10, chaque montee de
niveau vidait tout l'equipement vers les sacs, obligeant a tout rehabiller.
Cause racine: InitTalentForLevel() appelle ResetTalentSpecialization() a
chaque montee de niveau tant que level < MIN_SPECIALIZATION_LEVEL (10), ce
qui declenche RemoveEquipedSpecializationItems(). Cette derniere desequipe
tout objet dont les bits de specialisation ne matchent pas la spe (ou qui
echoue CanUseItem). Or sous 10 un perso n'a pas de vraie spe -> desequipement
indu, non-blizzlike.
Fix durable a la racine: early-return dans RemoveEquipedSpecializationItems()
si getLevel() < MIN_SPECIALIZATION_LEVEL. Couvre les 2 appelants sans
regression: la voie level-up sous 10 (ResetTalentSpecialization) est
neutralisee; la voie ActivateTalentGroup (changement de spe) est de toute
facon impossible sous 10. MIN_SPECIALIZATION_LEVEL deja en scope (Player.cpp).
Diagnostic produit en autonomie par le pipeline de triage de bugs, verifie
puis deploye manuellement.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Bug: un moine niveau 1 se retrouvait a ~20% de ses stats (28 PV au lieu
de ~150), rendant un mob niveau 1 "trop fort". La map statique
_unitDifficulty survivait a la deconnexion alors que les modificateurs
TOTAL_PCT de stats sont remis a 1.0 a chaque login. Apres un passage en
donjon puis relog, ClearBuffs retrouvait l'entree fantome et RETIRAIT un
buff jamais reapplique, divisant les stats par 5. Persos touches:
Selena guid 59 et Hakirosa guid 22.
Fix: hook OnLogout qui fait _unitDifficulty.erase(guid), resynchronisant
la map avec les modificateurs runtime. Le restart vide aussi la map
statique, les persos abimes se soignent au prochain login sans retouche
DB.
Integre aussi le travail Solocraft non commite anterieur present dans
l'arbre: exclusion Mythique et Mythique+, lecture de la config a chaque
changement de carte tunable par 'reload config' sans restart, et les
logs SoloDBG ayant servi au diagnostic.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The spell script spell_hun_dire_beast summoned the zone "Beast" guardian but
never ordered it to attack, and the ~108 summon templates had no AIName/ScriptName,
so the beasts idled next to the owner instead of engaging the target.
Add a dedicated ScriptedAI npc_pet_hun_dire_beast (mirroring npc_pet_hunter_snake_trap,
minus the snake-specific level-40 health formula and poison) that, on spawn, attacks
the summoner target (owner GetVictim / getAttackerForHelper), and bind it to the 108
inert level-1 friendly "Beast" summon templates via sql/sylvania/dire_beast_ai_20260705.sql.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
AreaTableEntry::IsSanctuary() hardcoded ContinentID==609 -> true, a legacy
WotLK-era workaround. On this Legion 7.3.5 client AreaTable.db2 none of the
Acherus/Ebon Hold areas (4298,4342,4356) carry AREA_FLAG_SANCTUARY, so the
hardcode made the entire DK starting zone a sanctuary. Spell::CheckCast then
returned SPELL_FAILED_NOTHING_TO_DISPEL on every hostile cast (in-sanctuary
non-friendly guard), so new death knights could only auto-attack the intro
mobs. Now purely reads the real AREA_FLAG_SANCTUARY bit from DB2.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
SetSpeedRate envoyait SMSG_MOVE_SPLINE_SET_RUN_SPEED pour toute creature car
GetPlayerBeingMoved() ne resout que les unites Player. Un vehicule pilote par un
joueur recevait donc un override spline -> le client croit que le serveur reprend
le controle et fige le vehicule (ex: Punch It / Foncer +50% vitesse, quete 14071
Rolling with my Homies, Hot Rod 34840). Prouve par capture opcode en jeu.
Fix: fallback sur GetPlayerMovingMe() (m_playerMovingMe, renseigne pour le
controle client direct: vehicules/possession) -> le paquet part en
SMSG_MOVE_SET_*_SPEED vers le pilote. Aucune incidence sur les PNJ IA.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
.qtest <nomJoueur> <questId> [complete] (allowConsole=true => SOAP sans selection)
Dump objectif-par-objectif l'etat live d'une quete pour un joueur en ligne
(statut, ObjectID, cur/req, OK/--). Option complete = AddQuest+ForceCompleteQuest.
Valide en jeu : qtest Testy 14109 -> 3 objectifs items listes.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Quete Escape from the Catacombs : si l escorte est interrompue
(deco / redemarrage serveur / sortie de portee), npc_escortAI ne
fait FailQuest qu a la mort -> la quete reste INCOMPLETE et l escorte,
ne demarrant qu a OnQuestAccept, ne pouvait plus repartir (blocage
definitif). Ajout OnGossipHello + StartEscortIfNeeded : reparler a
Lilatha avec la quete en cours relance l escorte.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
LootMgr: LootTemplate::Process gains a thread_local recursion-depth guard (RAII, cap 50). A self-referencing reference_loot_template row (ref 104 -> 104) recursed until the worldserver stack overflowed and crashed on ICC boss/trash loot; this core does not reject such cycles at load. DB row already removed live; this hardens against any future cycle.
boss_ragnaros_firelands: heroic phase 4 had no completion path (every SetData(DONE)/EVENT_DIE lived in the !IsHeroic branch), leaving Ragnaros unkillable in heroic. Add a heroic death branch gated on new flag heroicPhaseFour (set after the phase-4 heal) so the encounter completes and grants credit/loot. Normal mode unchanged.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
AsyncAcceptor::Bind() pose desormais SO_REUSEADDR entre open() et bind()
(aligne upstream TC) : permet le rebind immediat d un port encore en
TIME_WAIT apres un kill/crash brutal avec connexions actives, evitant le
"Could not bind ... Address already in use" au redemarrage. Complete le fix
StopNetwork (17845330) qui supprime deja le crash a l extinction.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Main.cpp appelle sToolSocketMgr.StopNetwork() inconditionnellement a l arret,
mais ToolSocketMgr::StartNetwork() n est jamais appele -> _acceptor reste
nullptr -> _acceptor->Close() deref null -> SIGSEGV a CHAQUE extinction
(coredumps recurrents, port libere lentement => bind-fail au relaunch).
Fix : garder _acceptor->Close() derriere un test de nullite dans
SocketMgr::StopNetwork() (aligne upstream TC). Verifie par comptage de
coredumps : arret de l ancien binaire = +1 crash, arret du nouveau = 0 crash,
et port libere en ~1s au lieu de ~51s.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Diag runtime (log spells+misc) : un Bond heroique declenche DEUX MoveJump -
94954/JUMP_DEST (phase LAUNCH) PUIS 6544 SPELL_EFFECT_DASH eff254 (phase HIT)
qui ecrase le premier. Le mouvement effectif est donc le DASH du sort 6544,
qui passe aussi par CalculateJumpSpeeds mais avec m_spellInfo->Id=6544 -> la
branche scopee 94954 ne s appliquait jamais (reglages sans effet ressenti).
Fix : condition `== 94954 || == 6544`. Les cles config HeroicLeap.* agissent
desormais sur le saut reel.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>