- 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>
Le trainer moderne generique First Aid (TrainerId 160) n'avait pas le
sort 3273 (apprenti = apprendre la profession), et 6 menus de Secourisme
routaient vers lui ou vers le trainer VIDE 877 => fenetre d'entrainement
vide pour un debutant (Shaina Fuller/Hurlevent, Arnok/Orgrimmar, Doc
Zapnozzle, Nus, Amelia Atherton, Anchorite Yazmina, Jandros Terres,
Aresella, Joseph Wilson).
Fix:
- +3273 sur trainer_spell TrainerId 160
- gossip_menu_option_trainer: menus 657,4761,5855,8802,22169,10826 -> 160
(tous 100% Secourisme, verifie)
Active a chaud sans restart: .reload trainer + .reload gossip_menu_option
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Remplace les facteurs en dur du saut 94954 par deux cles worldserver.conf
lues par cast (donc reglables via .reload config, sans redemarrage) :
HeroicLeap.SpeedMult (defaut 1.7) -> vitesse horizontale
HeroicLeap.HeightMult (defaut 2.5) -> hauteur d arc (speedZ *= sqrt(mult))
1.0/1.0 = Blizzlike (~21 yd/s, arc 2.5->10 yd, valeurs DB2 reelles).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Reglage de ressenti scope au seul sort de saut 94954 (n affecte pas les
autres JUMP_DEST) : speedXY *1.25 et speedZ *1.15 (hauteur d arc ~+32%)
applique apres le calcul generique de CalculateJumpSpeeds.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
CalculateJumpSpeeds lisait MiscValue/MiscValueB de SpellEffect comme une
vitesse verticale brute (speedZ = MiscValue/10), alors que la data DB2 7.3.5
moderne y stocke les hauteurs d arc min/max (en 1/10 yard). Pour le saut de
Bond heroique (94954: MiscValue=25, MiscValueB=100) cela donnait speedZ=2.5
-> arc plat ~0.16y + vitesse horizontale enorme = glissade facon Charge au
lieu d un vrai saut.
Portage du calcul base hauteur: speedXY derive de la vitesse de course,
hauteur d arc bornee entre MiscValue/10 et MiscValueB/10, convertie en
speedZ = sqrt(2 * gravity * height). Corrige tous les SPELL_EFFECT_JUMP_DEST
(Bond heroique, Desengagement, sauts Chasseur de demons, ...).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>