From b0cf308be22a147051c35088223d12333636f51e Mon Sep 17 00:00:00 2001 From: Andrew <47818697+Nyeriah@users.noreply.github.com> Date: Wed, 15 Nov 2023 18:59:03 -0300 Subject: [PATCH] fix(Scripts/SSC): Respawn Leotheras and fix last phase transition (#17720) --- .../rev_1700080856070649700.sql | 24 ++++ .../boss_leotheras_the_blind.cpp | 109 ++++++++---------- .../SerpentShrine/instance_serpent_shrine.cpp | 1 + 3 files changed, 75 insertions(+), 59 deletions(-) create mode 100644 data/sql/updates/pending_db_world/rev_1700080856070649700.sql diff --git a/data/sql/updates/pending_db_world/rev_1700080856070649700.sql b/data/sql/updates/pending_db_world/rev_1700080856070649700.sql new file mode 100644 index 000000000..73e13c72d --- /dev/null +++ b/data/sql/updates/pending_db_world/rev_1700080856070649700.sql @@ -0,0 +1,24 @@ +-- +SET @CGUID := 15013; + +DELETE FROM `creature` WHERE `guid` BETWEEN @CGUID+0 AND @CGUID+3; +INSERT INTO `creature` (`guid`, `id1`, `map`, `zoneId`, `areaId`, `spawnMask`, `phaseMask`, `equipment_id`, `position_x`, `position_y`, `position_z`, `orientation`, `spawntimesecs`, `wander_distance`, `currentwaypoint`, `curhealth`, `curmana`, `MovementType`, `unit_flags`, `dynamicflags`, `CreateObject`, `VerifiedBuild`) VALUES +(@CGUID+0, 21806, 548, 3607, 3607, 1, 1, 0, 369.23431396484375, -446.472564697265625, 29.6020355224609375, 0.820574045181274414, 7200, 0, 0, 29470, 0, 0, 0, 0, 1, 52148), -- 21806 (Area: 3607 - Difficulty: 4) CreateObject1 +(@CGUID+1, 21806, 548, 3607, 3607, 1, 1, 0, 385.1583251953125, -441.596710205078125, 29.61212921142578125, 2.810055494308471679, 7200, 0, 0, 29470, 0, 0, 0, 0, 1, 52148), -- 21806 (Area: 3607 - Difficulty: 4) CreateObject1 +(@CGUID+2, 21806, 548, 3607, 3607, 1, 1, 0, 373.21923828125, -429.14776611328125, 29.60641860961914062, 5.049488067626953125, 7200, 0, 0, 29470, 0, 0, 0, 0, 1, 52148), -- 21806 (Area: 3607 - Difficulty: 4) CreateObject1 +(@CGUID+3, 21215, 548, 3607, 3607, 1, 1, 0, 376.5428466796875, -438.630889892578125, 29.60830116271972656, 2.670353651046752929, 7200, 0, 0, 0, 0, 0, 0, 0, 1, 52148); -- 21215 (Area: 3607 - Difficulty: 4) CreateObject1 (Auras: 37546 - 37546) + +DELETE FROM `creature_addon` WHERE `guid` = @CGUID+3; +INSERT INTO `creature_addon` (`guid`, `path_id`, `mount`, `bytes1`, `bytes2`, `auras`) VALUES +(@CGUID+3, 0, 0, 8, 1, '37546'); -- 21215 - 37546 - 37546 + +DELETE FROM `creature_formations` WHERE `leaderGUID` = @CGUID+3; +INSERT INTO `creature_formations` (`leaderGUID`, `memberGUID`, `dist`, `angle`, `groupAI`, `point_1`, `point_2`) VALUES +(@CGUID+3, @CGUID+3, 0, 0, 24, 0, 0), +(@CGUID+3, @CGUID+0, 0, 0, 24, 0, 0), +(@CGUID+3, @CGUID+1, 0, 0, 24, 0, 0), +(@CGUID+3, @CGUID+2, 0, 0, 24, 0, 0); + +DELETE FROM `smart_scripts` WHERE (`entryorguid` = 21806) AND (`source_type` = 0) AND (`id` IN (4)); +INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `event_param5`, `event_param6`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_param4`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES +(21806, 0, 4, 0, 6, 0, 100, 0, 0, 0, 0, 0, 0, 0, 223, 1, 0, 0, 0, 0, 0, 205, 2, 1, 0, 0, 0, 0, 0, 0, 'Greyheart Spellbinder - On Just Died - Do Action ID 1 (ACTION_CHECK_SPELLBINDERS)'); diff --git a/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_leotheras_the_blind.cpp b/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_leotheras_the_blind.cpp index c70814ceb..629d5dcc6 100644 --- a/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_leotheras_the_blind.cpp +++ b/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_leotheras_the_blind.cpp @@ -15,6 +15,7 @@ * with this program. If not, see . */ +#include "CreatureGroups.h" #include "Player.h" #include "ScriptMgr.h" #include "ScriptedCreature.h" @@ -56,10 +57,10 @@ enum Spells enum Misc { - MAX_CHANNELERS = 3, - - NPC_GREYHEART_SPELLBINDER = 21806, NPC_SHADOW_OF_LEOTHERAS = 21875, + NPC_GREYHEART_SPELLBINDER = 21806, + + ACTION_CHECK_SPELLBINDERS = 1 }; enum Groups @@ -68,35 +69,21 @@ enum Groups GROUP_DEMON = 2 }; -const Position channelersPos[MAX_CHANNELERS] = -{ - {367.11f, -421.48f, 29.52f, 5.0f}, - {380.11f, -435.48f, 29.52f, 2.5f}, - {362.11f, -437.48f, 29.52f, 0.9f} -}; - struct boss_leotheras_the_blind : public BossAI { - boss_leotheras_the_blind(Creature* creature) : BossAI(creature, DATA_LEOTHERAS_THE_BLIND) - { - scheduler.SetValidator([this] - { - return !me->HasUnitState(UNIT_STATE_CASTING); - }); - } + boss_leotheras_the_blind(Creature* creature) : BossAI(creature, DATA_LEOTHERAS_THE_BLIND) { } void Reset() override { BossAI::Reset(); DoCastSelf(SPELL_CLEAR_CONSUMING_MADNESS, true); DoCastSelf(SPELL_DUAL_WIELD, true); - me->SetStandState(UNIT_STAND_STATE_KNEEL); - me->LoadEquipment(0, true); me->SetReactState(REACT_PASSIVE); _recentlySpoken = false; - SummonChannelers(); ScheduleHealthCheckEvent(15, [&]{ + me->RemoveAurasDueToSpell(SPELL_WHIRLWIND); + if (me->GetDisplayId() != me->GetNativeDisplayId()) { //is currently in metamorphosis @@ -104,12 +91,17 @@ struct boss_leotheras_the_blind : public BossAI me->RemoveAurasDueToSpell(SPELL_METAMORPHOSIS); scheduler.RescheduleGroup(GROUP_COMBAT, 10s); } + + me->SetUnitFlag(UNIT_FLAG_NOT_SELECTABLE); + DoResetThreatList(); + me->ClearTarget(); + me->SendMeleeAttackStop(); scheduler.CancelGroup(GROUP_DEMON); scheduler.DelayAll(10s); - me->SetStandState(UNIT_STAND_STATE_KNEEL); me->SetReactState(REACT_PASSIVE); + me->SetStandState(UNIT_STAND_STATE_KNEEL); me->GetMotionMaster()->Clear(); me->StopMoving(); Talk(SAY_FINAL_FORM); @@ -119,52 +111,41 @@ struct boss_leotheras_the_blind : public BossAI DoCastSelf(SPELL_SUMMON_SHADOW_OF_LEOTHERAS); }).Schedule(6s, [this](TaskContext) { + me->RemoveUnitFlag(UNIT_FLAG_NOT_SELECTABLE); me->SetStandState(UNIT_STAND_STATE_STAND); me->SetReactState(REACT_AGGRESSIVE); - me->GetMotionMaster()->MoveChase(me->GetVictim()); + me->ResumeChasingVictim(); + + if (me->GetVictim()) + { + me->SetTarget(me->GetVictim()->GetGUID()); + me->SendMeleeAttackStart(me->GetVictim()); + } }); }); } - void SummonChannelers() + void DoAction(int32 actionId) override { - me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_BANISH, false); - DoCastSelf(SPELL_BANISH); - me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_BANISH, true); - - //probably needs a spell instead - summons.DespawnAll(); - for (uint8 i = 0; i < MAX_CHANNELERS; ++i) + if (actionId == ACTION_CHECK_SPELLBINDERS) { - me->SummonCreature(NPC_GREYHEART_SPELLBINDER, channelersPos[i], TEMPSUMMON_CORPSE_TIMED_DESPAWN, 5000); - } - } - - void JustSummoned(Creature* summon) override - { - summons.Summon(summon); - } - - void SummonedCreatureDies(Creature* summon, Unit*) override - { - me->SetInCombatWithZone(); - summons.Despawn(summon); - if (summon->GetEntry() == NPC_GREYHEART_SPELLBINDER) - { - if (!summons.HasEntry(NPC_GREYHEART_SPELLBINDER)) + if (CreatureGroup* formation = me->GetFormation()) { - me->RemoveAllAuras(); - me->LoadEquipment(); - me->SetReactState(REACT_AGGRESSIVE); - me->SetStandState(UNIT_STAND_STATE_STAND); - Talk(SAY_AGGRO); - - scheduler.Schedule(10min, [this](TaskContext) + if (!formation->IsAnyMemberAlive(true)) { - DoCastSelf(SPELL_BERSERK); - }); + me->RemoveAllAuras(); + me->LoadEquipment(); + me->SetReactState(REACT_AGGRESSIVE); + me->SetStandState(UNIT_STAND_STATE_STAND); + Talk(SAY_AGGRO); - ElfTime(); + scheduler.Schedule(10min, [this](TaskContext) + { + DoCastSelf(SPELL_BERSERK); + }); + + ElfTime(); + } } } } @@ -219,12 +200,22 @@ struct boss_leotheras_the_blind : public BossAI if (me->GetDisplayId() == me->GetNativeDisplayId()) { - DoMeleeAttackIfReady(); + if (me->GetReactState() != REACT_PASSIVE) + { + DoMeleeAttackIfReady(); + } } else if (me->isAttackReady(BASE_ATTACK)) { - me->CastSpell(me->GetVictim(), SPELL_CHAOS_BLAST, false); - me->setAttackTimer(BASE_ATTACK, 2000); + if (DoCastVictim(SPELL_CHAOS_BLAST) != SPELL_CAST_OK) + { + // Auto-attacks if there are no valid targets to cast his spell on f.e pet taunted. + DoMeleeAttackIfReady(); + } + else + { + me->setAttackTimer(BASE_ATTACK, 2000); + } } } private: diff --git a/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/instance_serpent_shrine.cpp b/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/instance_serpent_shrine.cpp index 96efecd58..2aa674ebc 100644 --- a/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/instance_serpent_shrine.cpp +++ b/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/instance_serpent_shrine.cpp @@ -31,6 +31,7 @@ DoorData const doorData[] = ObjectData const creatureData[] = { + { NPC_LEOTHERAS_THE_BLIND, DATA_LEOTHERAS_THE_BLIND }, { NPC_FATHOM_LORD_KARATHRESS, DATA_FATHOM_LORD_KARATHRESS }, { 0, 0 } };