From fc00afa7035c385aed3eb4af89249c686ab20cf5 Mon Sep 17 00:00:00 2001 From: SylvaniaCore deploy Date: Mon, 17 Aug 2026 22:49:08 +0200 Subject: [PATCH] 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 --- sql/sylvania/vortex_altairus_crash.sql | 50 +++++++++++++++++++ .../TheVortexPinnacle/boss_altairus.cpp | 6 ++- .../boss_grand_vizier_ertan.cpp | 4 +- 3 files changed, 56 insertions(+), 4 deletions(-) create mode 100644 sql/sylvania/vortex_altairus_crash.sql diff --git a/sql/sylvania/vortex_altairus_crash.sql b/sql/sylvania/vortex_altairus_crash.sql new file mode 100644 index 0000000..9aebeec --- /dev/null +++ b/sql/sylvania/vortex_altairus_crash.sql @@ -0,0 +1,50 @@ +-- ===================================================================== +-- CRASH SERVEUR — Altairus, 2e boss de la Cime du Vortex (carte 657) +-- +-- Signalé par un joueur : le boss « bugue à 1 % » et le serveur tombe. +-- Reproduit deux fois (dumps SIGSEGV du 17/08 à 22:09:26 et 22:15:39). +-- +-- Pile d'appel du dump : +-- Object::SetUInt32Value <- this = NULL (rdi=0, champ 125, valeur 1) +-- Unit::Kill +-- Unit::DealDamage / DealSpellDamage / Spell::cast +-- Le champ 125 est UNIT_NPC_FLAGS (OBJECT_END + 0x71) et la valeur 1 est +-- UNIT_NPC_FLAG_GOSSIP : cela désigne sans ambiguïté boss_altairus.cpp:168. +-- +-- Cause : à la mort du boss, JustDied() invoque un « Slipstream » d'entrée +-- 45457 (NPC_SLIPSTREAM_TWO) pour ouvrir le passage vers la 2e plateforme, +-- puis lui pose son drapeau de dialogue : +-- Creature* Slipstream = me->SummonCreature(NPC_SLIPSTREAM_TWO, ...); +-- Slipstream->SetUInt32Value(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP); +-- Or l'entrée 45457 N'EXISTE PAS en base (trou entre 45456 et 45460), ni +-- chez nous ni dans les bases de référence 7.3.5 et TDB. SummonCreature +-- renvoie donc nullptr, que le script déréférence sans contrôle : segfault +-- systématique à chaque mort d'Altairus. +-- +-- Le script npc_slipstream_two existe pourtant et est bien enregistré +-- (vortex_pinnacle.cpp:336) : il propose « Teleport me to the second +-- platform » vers (-1188.86, 475.83, 635.59), c'est-à-dire l'accès à Asaad, +-- le 3e boss. Sans lui, le donjon serait de toute façon infranchissable. +-- +-- Correctif SQL : création de l'entrée 45457 par clonage exact de 45455 +-- (« Slipstream », déjà spawné au même endroit, -1198.79/107.05/740.71), +-- avec le script npc_slipstream_two et le drapeau de dialogue. +-- +-- Un garde-fou est ajouté en parallèle côté C++ (contrôle du nullptr) pour +-- qu'aucune donnée manquante ne puisse plus jamais faire tomber le serveur +-- à cet endroit. +-- +-- NOTE : le drapeau de dialogue fonctionne dès le rechargement du template, +-- mais la LIAISON DU SCRIPT 'npc_slipstream_two' n'est établie qu'au +-- démarrage (la liste des noms de scripts est figée au boot). Un +-- redémarrage est donc nécessaire pour que la téléportation soit réellement +-- proposée. +-- ===================================================================== + +DROP TEMPORARY TABLE IF EXISTS `tmp_slipstream`; +CREATE TEMPORARY TABLE `tmp_slipstream` AS SELECT * FROM `creature_template` WHERE `entry`=45455; +UPDATE `tmp_slipstream` SET `entry`=45457, `ScriptName`='npc_slipstream_two', `npcflag`=1; + +DELETE FROM `creature_template` WHERE `entry`=45457; +INSERT INTO `creature_template` SELECT * FROM `tmp_slipstream`; +DROP TEMPORARY TABLE `tmp_slipstream`; diff --git a/src/server/scripts/Kalimdor/TheVortexPinnacle/boss_altairus.cpp b/src/server/scripts/Kalimdor/TheVortexPinnacle/boss_altairus.cpp index 9c25c32..877bad3 100644 --- a/src/server/scripts/Kalimdor/TheVortexPinnacle/boss_altairus.cpp +++ b/src/server/scripts/Kalimdor/TheVortexPinnacle/boss_altairus.cpp @@ -164,8 +164,10 @@ public: summons.DespawnAll(); me->SetHover(false); - Creature * Slipstream = me->SummonCreature(NPC_SLIPSTREAM_TWO, -1198.95f, 106.13f, 743.16f, 1.2f, TEMPSUMMON_CORPSE_DESPAWN, 0); - Slipstream->SetUInt32Value(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP); + // Le template peut manquer en base : sans ce controle, un summon rate + // faisait tomber le serveur a chaque mort du boss (SIGSEGV dans Unit::Kill). + if (Creature* slipstream = me->SummonCreature(NPC_SLIPSTREAM_TWO, -1198.95f, 106.13f, 743.16f, 1.2f, TEMPSUMMON_CORPSE_DESPAWN, 0)) + slipstream->SetUInt32Value(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP); } void UpdateAI(uint32 diff) override diff --git a/src/server/scripts/Kalimdor/TheVortexPinnacle/boss_grand_vizier_ertan.cpp b/src/server/scripts/Kalimdor/TheVortexPinnacle/boss_grand_vizier_ertan.cpp index 70dea5e..c400f63 100644 --- a/src/server/scripts/Kalimdor/TheVortexPinnacle/boss_grand_vizier_ertan.cpp +++ b/src/server/scripts/Kalimdor/TheVortexPinnacle/boss_grand_vizier_ertan.cpp @@ -149,8 +149,8 @@ public: me->DespawnCreaturesInArea(NPC_LURKING_TEMPEST, 120.0f); me->DespawnCreaturesInArea(NPC_CYCLONE_SHIELD, 120.0f); - Creature * Slipstream = me->SummonCreature(45455, -765.79f, -44.01f, 641.91f, 4.0f, TEMPSUMMON_CORPSE_DESPAWN, 0); - Slipstream->SetUInt32Value(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP); + if (Creature* slipstream = me->SummonCreature(45455, -765.79f, -44.01f, 641.91f, 4.0f, TEMPSUMMON_CORPSE_DESPAWN, 0)) + slipstream->SetUInt32Value(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP); } void UpdateAI(uint32 diff) override