- 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>
27 maîtres de métier spawnés (forge, alchimie, enchantement, couture,
travail du cuir, cuisine, joaillerie, premiers soins, archéologie, hub
profession Pandarie) portaient le flag GOSSIP sans option type-5 sur
leur menu -> menu vide, impossible de s'entraîner. La donnée d'entraînement
existe (npc_trainer legacy chargée en mémoire) mais n'était pas atteignable.
Ajout d'une option de gossip type 5 (OptionNpcFlag=16, TrainerId=0 ->
fallback SendTrainerListLegacy) sur les 23 menus distincts concernés.
Appliqué sur dc_world LIVE + .reload gossip_menu_option. Rollback fourni.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Fix: die in dungeon -> ghost sent across the world + corpse locked in instance -> cannot resurrect. Links 18 Cata/WoD/Legion dungeon interior zones to existing entrance-zone WorldSafeLocs. Applied live + reload graveyard_zone (1569 to 1587).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>