Hyjal : parler a Jaina faisait tomber le serveur -- et faction 16 au Rivage brise
1) PLANTAGE DU SERVEUR, cause reelle de la coupure de cette nuit Trace du vidage 3007513 : #0 Trinity::Assert(...) #1 npc_jaina_proudmoore::OnGossipHello(Player*, Creature*) #2 WorldSession::HandleGossipHelloOpcode hyjal.cpp utilisait ENSURE_AI(hyjalAI, creature->AI()), qui ASSERTE. Or GetAI() ne fabrique une hyjalAI que si GetHyjalAI() la trouve, donc uniquement dans l instance du Mont Hyjal. Ailleurs la creature recoit une IA quelconque et l assertion tue le process. Declencheur : un exemplaire de Jaina (17772) se trouve sur la carte 0, a Hurlevent (-8295, 1386), en plus de celui du Mont Hyjal. Lui parler suffisait a planter le serveur -- faille exploitable par n importe quel joueur, sans commande ni privilege. Les 5 occurrences passent en dynamic_cast avec sortie propre. J avais d abord conclu a une recursion en me fiant a la taille du vidage (387 Mo contre 133). C ETAIT FAUX : cette taille reflete la memoire allouee au moment du plantage, pas un debordement de pile. La trace, elle, etait parfaitement lisible. 2) RIVAGE BRISE : factions demoniaques ramenees a 16 Etabli par TEST A/B, pas par raisonnement. Une seule entree basculee en faction 16 (Molosse de l effroi gangrene, 90686), toutes choses egales par ailleurs. Verdict en jeu : « les molosses sont maintenant attaquables », les autres non. La sonde SPAWNDBG confirme que seule la faction distingue les deux : Felstalker Dreadhound faction=16 drapeaux=32768 drapeaux2=0 OK Felguard Legionnaire faction=2780 drapeaux=32768 drapeaux2=0 bloque Pourquoi 2780 echoue reste INEXPLIQUE : FactionTemplate.db2 lui donne EnemyGroup=15 (ennemi de tous) et sa faction 1786 a ReputationIndex=-1, donc aucune reputation n intervient. Sur le papier elle devrait etre hostile. Le refus vient du client, qu aucune sonde serveur ne peut observer. On retient donc la faction 16, demontree fonctionnelle dans ce scenario meme -- ecart assume avec la donnee de reference. 101 entrees, 464 spawns. Effet secondaire bienvenu : les demons cessent de s entretuer (Friend_0=14). 3) COMPTEUR : tout demon compte desormais Signale : « les molosses sont attaquables mais ne comptent pas dans l objectif ». OnUnitDeath ne reconnaissait que les cinq entrees invoquees par le script. On s appuie desormais sur le type demon plutot que sur une liste de 101 entrees qui vieillirait mal. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,48 @@
|
||||
-- =====================================================================
|
||||
-- Rivage brisé (carte 1460) — factions démoniaques ramenées à 16
|
||||
--
|
||||
-- ÉTABLI PAR TEST A/B, pas par raisonnement.
|
||||
-- Une seule entrée a été basculée en faction 16 — le Molosse de l'effroi
|
||||
-- gangrené (90686) — toutes choses égales par ailleurs. Résultat en jeu :
|
||||
-- « les molosses sont maintenant attaquables », les autres non.
|
||||
--
|
||||
-- La sonde SPAWNDBG confirme que seule la faction distingue les deux :
|
||||
-- Felstalker Dreadhound faction=16 drapeaux=32768 drapeaux2=0 → OK
|
||||
-- Felguard Legionnaire faction=2780 drapeaux=32768 drapeaux2=0 → bloqué
|
||||
-- Mêmes drapeaux, même niveau, même vie, mêmes phases.
|
||||
--
|
||||
-- POURQUOI 2780 ÉCHOUE, ALORS QUE LA THÉORIE DIT L'INVERSE
|
||||
-- `FactionTemplate.db2` donne pour 2780 : Faction=1786, EnemyGroup=15,
|
||||
-- soit ennemi de tous les groupes, joueurs compris. Et 1786 (« Burning
|
||||
-- Legion Invaders ») a ReputationIndex=-1, donc aucune réputation
|
||||
-- n'intervient. Sur le papier, 2780 devrait être hostile.
|
||||
--
|
||||
-- Elle ne l'est pas dans les faits, et je n'ai pas élucidé pourquoi. Le
|
||||
-- refus vient du client, qui n'interroge jamais le serveur — aucune sonde
|
||||
-- côté serveur ne peut l'observer.
|
||||
--
|
||||
-- CHOIX ASSUMÉ : on retient la faction 16, qui fonctionne de façon
|
||||
-- démontrée dans ce scénario même — c'est celle qu'emploient les démons
|
||||
-- invoqués par le script. C'est un écart avec la donnée de référence,
|
||||
-- consenti parce qu'il rend le contenu jouable.
|
||||
--
|
||||
-- Effet secondaire bienvenu : les démons cessent de s'entretuer. La
|
||||
-- faction 16 les rend amis entre eux (Friend_0=14), ce qui met fin au
|
||||
-- « démons inattaquables qui se battent avec les attaquables ».
|
||||
--
|
||||
-- PORTÉE : uniquement les entrées exclusives à la carte 1460, comme pour
|
||||
-- les correctifs précédents. Les entrées partagées avec d'autres cartes
|
||||
-- sont écartées.
|
||||
--
|
||||
-- Retour arrière : chantiers/rivage_brise/retour_faction16_1460.sql
|
||||
-- =====================================================================
|
||||
|
||||
UPDATE `creature_template` ct
|
||||
JOIN (SELECT DISTINCT c.id
|
||||
FROM creature c
|
||||
JOIN creature_template t ON t.entry = c.id
|
||||
WHERE c.map = 1460
|
||||
AND t.faction IN (2780, 1768)
|
||||
AND c.id NOT IN (SELECT DISTINCT id FROM creature WHERE map <> 1460)) AS cible
|
||||
ON cible.id = ct.entry
|
||||
SET ct.faction = 16;
|
||||
Reference in New Issue
Block a user