diff --git a/sql/sylvania/rivage_1460_etats.sql b/sql/sylvania/rivage_1460_etats.sql new file mode 100644 index 0000000..8bd6ad1 --- /dev/null +++ b/sql/sylvania/rivage_1460_etats.sql @@ -0,0 +1,34 @@ +-- ===================================================================== +-- Rivage brisé (carte 1460) — objets affichés comme déjà utilisés +-- +-- SIGNALÉ EN JEU : « le gameobject de la flèche n'est physiquement pas +-- visible ni cliquable, à la place il y a un minuscule skin de chien ». +-- +-- Les six Flèches de malheur (240194) étaient enregistrées en +-- `state = 2`, soit GO_STATE_ACTIVE_ALTERNATIVE. Le commentaire de notre +-- propre énumération le décrit sans ambiguïté : +-- « show in world as used in alt way and not reset » +-- L'objet est donc affiché dans sa forme CONSOMMÉE dès l'apparition, +-- avec le modèle de remplacement correspondant — et il n'est plus +-- utilisable, puisqu'il se présente comme déjà employé. +-- +-- Ce n'était ni le modèle ni l'orientation : `displayId` 37460 existe +-- bien dans GameObjectDisplayInfo du build 7.3.5.26972, avec une boîte +-- englobante de 44 × 44 × 71 unités, et la rotation (0,0,0,1) est +-- l'identité, la même que celle des Cages de la Légion qui s'affichent +-- correctement. +-- +-- État attendu : GO_STATE_READY (1), celui de 79 des 101 objets de la +-- carte, dont toutes les cages, les fleurs et les navires. +-- +-- PORTÉE : les six flèches uniquement. Les Canons de siège (240214) et +-- deux Portails de la Légion partagent le même défaut apparent, mais +-- rien ne prouve encore que leur état soit fautif — un canon peut +-- légitimement s'afficher chargé. À vérifier en jeu avant d'y toucher. +-- ===================================================================== + +UPDATE `gameobject` + SET `state` = 1 + WHERE `id` = 240194 + AND `map` = 1460 + AND `state` = 2; diff --git a/src/server/scripts/Maelstrom/Stonecore/boss_high_priestess_azil.cpp b/src/server/scripts/Maelstrom/Stonecore/boss_high_priestess_azil.cpp index b4ad21a..e9fa512 100644 --- a/src/server/scripts/Maelstrom/Stonecore/boss_high_priestess_azil.cpp +++ b/src/server/scripts/Maelstrom/Stonecore/boss_high_priestess_azil.cpp @@ -665,7 +665,9 @@ public: void ExitVehicle() { - GetCaster()->ExitVehicle(); + // Meme prudence : rien ne garantit la presence du lanceur. + if (Unit* caster = GetCaster()) + caster->ExitVehicle(); } void Register() override @@ -692,12 +694,41 @@ public: void HandleScript(SpellEffIndex /*effIndex*/) { - Creature* target = GetHitUnit()->ToCreature(); + // ============================================================= + // SylvaniaCore : objet de visee jamais verifie -> SIGSEGV. + // + // SIGNALE EN JEU : « si on attend la phase deux sans le + // frapper, le serveur plante ». Reproduction fidele, et deux + // vidages memoire l'ont confirmee, pile en main : + // #0 spell_seismic_shard::HandleScript + // #1 Spell::HandleEffects + // ... + // #13 InstanceMap::Update + // + // GetDynObject renvoie un pointeur NUL quand l'objet de visee + // n'existe pas -- pas encore cree, ou deja expire. La ligne + // suivante le dereferencait sans le moindre test, ce qui + // emporte le processus entier : le plantage a lieu dans le + // fil de mise a jour de la carte, pas dans une session. + // + // GetCaster() et GetHitUnit() sont verifies au passage : rien + // ne garantit leur presence au moment ou l'effet est traite, + // et un lanceur mort entre le lancement et l'impact suffit. + // ============================================================= + Unit* caster = GetCaster(); + Unit* hit = GetHitUnit(); + if (!caster || !hit) + return; + + Creature* target = hit->ToCreature(); if (!target) return; + DynamicObject* dynamicObject = caster->GetDynObject(SPELL_SEISMIC_SHARD_TARGETING); + if (!dynamicObject) + return; + target->ExitVehicle(); - DynamicObject* dynamicObject = GetCaster()->GetDynObject(SPELL_SEISMIC_SHARD_TARGETING); target->CastSpell(dynamicObject->GetPositionX(), dynamicObject->GetPositionY(), dynamicObject->GetPositionZ(), SPELL_SEISMIC_SHARD_MISSLE, true); }