From 08426fa6d463a956fb43fffec9f5ce0b5452aefe Mon Sep 17 00:00:00 2001 From: BlaMacfly <165155133+BlaMacfly@users.noreply.github.com> Date: Sat, 12 Sep 2026 19:47:24 +0200 Subject: [PATCH] Terres de feu et Zul Aman : trois blocages signales en jeu Nalorakk restait plante au-dessus de son escalier apres la deuxieme vague. Le trajet entre deux paliers grimpe une structure VMAP (le terrain, lui, reste a z=12,5 sur toute la rampe) ; quand le calcul de chemin cale, le boss s arrete en route et, comme il attend d etre arrive pour enchainer, l evenement ne repart plus. Chaque deplacement est desormais borne a vingt secondes, au-dela le boss est pose d office sur l etape. Alysrazor finissait toujours dans la lave : la ramener dans JustDied arrivait trop tard, la chute etait engagee, et MoveFall vise le terrain (z=48) en traversant la plateforme, qui n est qu une structure VMAP a 55,5. Elle est maintenant posee au centre de l arene AVANT le coup fatal, via DamageTaken, et plus aucune chute n est declenchee. Rhyolith restait bloque en premiere forme a un point de vie. Son UpdateAI sortait sur UpdateVictim avant d avoir teste la bascule en phase 2 -- or les joueurs frappent les pieds et non le colosse, qui se retrouve sans cible. Le passage de phase est teste en premier. --- .../EasternKingdoms/ZulAman/boss_nalorakk.cpp | 35 ++++++++++++++++--- .../Kalimdor/Firelands/boss_alysrazor.cpp | 18 +++++++--- .../Kalimdor/Firelands/boss_lord_rhyolith.cpp | 11 ++++-- 3 files changed, 53 insertions(+), 11 deletions(-) diff --git a/src/server/scripts/EasternKingdoms/ZulAman/boss_nalorakk.cpp b/src/server/scripts/EasternKingdoms/ZulAman/boss_nalorakk.cpp index ce9a817..a81f99a 100644 --- a/src/server/scripts/EasternKingdoms/ZulAman/boss_nalorakk.cpp +++ b/src/server/scripts/EasternKingdoms/ZulAman/boss_nalorakk.cpp @@ -115,7 +115,7 @@ class boss_nalorakk : public CreatureScript { boss_nalorakkAI(Creature* creature) : BossAI(creature, DATA_NALORAKK), _bearForm(false), _waveEvent(true), _waveInProgress(false), _inMove(false), - _wave(0), _currentPoint(0), _targetPoint(0), _checkTimer(0) { } + _wave(0), _currentPoint(0), _targetPoint(0), _checkTimer(0), _moveTimeout(0) { } void Reset() override { @@ -134,6 +134,7 @@ class boss_nalorakk : public CreatureScript _currentPoint = 0; _targetPoint = 0; _checkTimer = 0; + _moveTimeout = 0; _waveGuids.clear(); me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE | UNIT_FLAG_NON_ATTACKABLE); @@ -284,13 +285,15 @@ class boss_nalorakk : public CreatureScript : (_targetPoint == 8 ? 8 : _targetPoint); _currentPoint = next; + _moveTimeout = 20000; me->GetMotionMaster()->MovePoint(_currentPoint, NalorakkWay[_currentPoint][0], NalorakkWay[_currentPoint][1], NalorakkWay[_currentPoint][2]); } - void MovementInform(uint32 type, uint32 id) override + // Arrivee a une etape -- soit annoncee par le moteur de deplacement, soit + // forcee par le chrono ci-dessous quand la montee se bloque. + void OnReachedPoint() { - if (!_waveEvent || type != POINT_MOTION_TYPE || !_inMove || _currentPoint != id) - return; + _moveTimeout = 0; if (_currentPoint == _targetPoint) { @@ -302,6 +305,14 @@ class boss_nalorakk : public CreatureScript AdvanceOnePoint(); } + void MovementInform(uint32 type, uint32 id) override + { + if (!_waveEvent || type != POINT_MOTION_TYPE || !_inMove || _currentPoint != id) + return; + + OnReachedPoint(); + } + void EnterCombat(Unit* /*who*/) override { Talk(SAY_AGGRO); @@ -350,6 +361,21 @@ class boss_nalorakk : public CreatureScript void UpdateAI(uint32 diff) override { + // Le trajet entre deux paliers passe par un escalier bati en VMAP : si le + // calcul de chemin cale, le boss reste plante en route et l'evenement ne + // repart jamais. Au-dela de vingt secondes on le pose d'office sur l'etape. + if (_inMove && _moveTimeout) + { + if (_moveTimeout <= diff) + { + me->GetMotionMaster()->Clear(false); + me->NearTeleportTo(NalorakkWay[_currentPoint][0], NalorakkWay[_currentPoint][1], NalorakkWay[_currentPoint][2], me->GetOrientation()); + OnReachedPoint(); + } + else + _moveTimeout -= diff; + } + // Deroulement des vagues : il ne recule qu'une fois la vague abattue. if (_waveInProgress) { @@ -447,6 +473,7 @@ class boss_nalorakk : public CreatureScript uint32 _currentPoint; uint32 _targetPoint; uint32 _checkTimer; + uint32 _moveTimeout; std::vector _waveGuids; }; diff --git a/src/server/scripts/Kalimdor/Firelands/boss_alysrazor.cpp b/src/server/scripts/Kalimdor/Firelands/boss_alysrazor.cpp index a590ff1..81ba40d 100644 --- a/src/server/scripts/Kalimdor/Firelands/boss_alysrazor.cpp +++ b/src/server/scripts/Kalimdor/Firelands/boss_alysrazor.cpp @@ -532,6 +532,20 @@ class boss_alysrazor : public CreatureScript instance->SendEncounterUnit(ENCOUNTER_FRAME_ENGAGE, me); } + // Elle meurt en vol. La ramener dans JustDied ne suffisait pas : la chute est + // deja engagee et MoveFall vise le terrain (la lave, vers z=48) en traversant + // la plateforme, qui n'est qu'une structure VMAP a 55,5. On la pose donc au + // centre de l'arene AVANT le coup fatal, et sans declencher de chute. + void DamageTaken(Unit* /*attacker*/, uint32& damage) override + { + if (damage >= me->GetHealth()) + { + me->SetCanFly(false); + me->SetDisableGravity(false); + me->NearTeleportTo(centerPos.GetPositionX(), centerPos.GetPositionY(), centerPos.GetPositionZ(), centerPos.GetOrientation()); + } + } + void JustDied(Unit* /*killer*/) override { _JustDied(); @@ -539,11 +553,7 @@ class boss_alysrazor : public CreatureScript RemoveEncounterAuras(); me->SetCanFly(false); me->SetDisableGravity(false); - // Elle meurt en vol : laissee a elle-meme, la depouille traverse le vide - // entre les plateformes et finit dans la lave, butin compris. On la ramene - // au centre de l'arene avant la chute, comme en jeu officiel. me->NearTeleportTo(centerPos.GetPositionX(), centerPos.GetPositionY(), centerPos.GetPositionZ(), centerPos.GetOrientation()); - me->GetMotionMaster()->MoveFall(); } void KilledUnit(Unit* who) override diff --git a/src/server/scripts/Kalimdor/Firelands/boss_lord_rhyolith.cpp b/src/server/scripts/Kalimdor/Firelands/boss_lord_rhyolith.cpp index f9fd7c4..cc8f654 100644 --- a/src/server/scripts/Kalimdor/Firelands/boss_lord_rhyolith.cpp +++ b/src/server/scripts/Kalimdor/Firelands/boss_lord_rhyolith.cpp @@ -300,9 +300,11 @@ class boss_lord_rhyolith : public CreatureScript void UpdateAI(uint32 diff) override { - if (!UpdateVictim()) - return; - + // Les joueurs frappent les pieds, jamais le colosse lui-meme : il lui + // arrive de n'avoir aucune cible, et on sortait alors d'UpdateAI avant + // meme d'avoir teste la bascule en phase 2. Le boss restait plante en + // premiere forme a un point de vie. Le passage de phase passe donc en + // premier, avant toute verification de cible. if ((instance->GetData(DATA_RHYOLITH_HEALTH_SHARED) != 0)) me->SetHealth(instance->GetData(DATA_RHYOLITH_HEALTH_SHARED) * 2); @@ -350,6 +352,9 @@ class boss_lord_rhyolith : public CreatureScript return; } + if (!UpdateVictim()) + return; + events.Update(diff); if (me->HasUnitState(UNIT_STATE_CASTING))