From 7795dc4379052e4cbadce5982b8213edc28f8725 Mon Sep 17 00:00:00 2001 From: Andrew <47818697+Nyeriah@users.noreply.github.com> Date: Mon, 20 Nov 2023 06:46:38 -0300 Subject: [PATCH] fix(Scripts/SSC): Script Hydross OOC event (#17804) * fix(Scripts/SSC): Script Hydross OOC event * Update rev_1700448248255858600.sql * Update boss_hydross_the_unstable.cpp * Update rev_1700448248255858600.sql --- .../rev_1700448248255858600.sql | 27 ++++++++ .../WaypointMovementGenerator.cpp | 13 ++++ .../boss_hydross_the_unstable.cpp | 63 +++++++++++++++---- 3 files changed, 92 insertions(+), 11 deletions(-) create mode 100644 data/sql/updates/pending_db_world/rev_1700448248255858600.sql diff --git a/data/sql/updates/pending_db_world/rev_1700448248255858600.sql b/data/sql/updates/pending_db_world/rev_1700448248255858600.sql new file mode 100644 index 00000000000000..1870e9ec6dd22d --- /dev/null +++ b/data/sql/updates/pending_db_world/rev_1700448248255858600.sql @@ -0,0 +1,27 @@ +-- +DELETE FROM `spell_target_position` WHERE `id` = 36459; +INSERT INTO `spell_target_position` (`ID`, `EffectIndex`, `MapID`, `PositionX`, `PositionY`, `PositionZ`, `Orientation`, `VerifiedBuild`) VALUES +(36459, 0, 548, -347.518, -350.367, 1.07459, 0, 52188); + +DELETE FROM `creature` WHERE `id1` IN (21260, 21253); + +SET @NPC := 21253; +SET @PATH := @NPC * 10; +DELETE FROM `waypoint_data` WHERE `id`=@PATH; +INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`orientation`,`delay`,`move_type`,`action`,`action_chance`,`wpguid`) VALUES +(@PATH,1,-323.41907,-329.45224,-1.5974255,0,0,0,0,100,0), +(@PATH,2,-304.07327,-324.3901,-1.6223572,0,0,0,0,100,0), +(@PATH,3,-285.72675,-317.75647,-1.6231745,0,0,0,0,100,0), +(@PATH,4,-268.1212,-317.92252,-1.6231549,0,0,0,0,100,0), +(@PATH,5,-250.01706,-326.13535,-1.6231577,0,0,0,0,100,0), +(@PATH,6,-232.28586,-345.37613,-0.82795566,0,3000,0,0,100,0), +(@PATH,7,-207.17967,-340.97714,-1.6231886,0,0,0,0,100,0), +(@PATH,8,-191.20467,-342.70514,-1.6231867,0,0,0,0,100,0), +(@PATH,9,-179.45354,-352.66028,-1.6231802,0,0,0,0,100,0), +(@PATH,10,-168.25655,-366.4079,-1.6235477,0,0,0,0,100,0), +(@PATH,11,-157.60028,-380.57797,-1.618623,0,0,0,0,100,0), +(@PATH,12,-142.09798,-404.16937,0.4633386,0,0,0,0,100,0), +(@PATH,13,-146.7672,-423.9643,1.0743836,0,0,0,0,100,0); + +DELETE FROM `creature_addon` WHERE `guid` IN (81027, 82865, 82967, 93788); +DELETE FROM `linked_respawn` WHERE `guid` IN (81027, 82865, 82967, 93788); diff --git a/src/server/game/Movement/MovementGenerators/WaypointMovementGenerator.cpp b/src/server/game/Movement/MovementGenerators/WaypointMovementGenerator.cpp index f1da9bbb5d8f3d..6658e76a63039b 100644 --- a/src/server/game/Movement/MovementGenerators/WaypointMovementGenerator.cpp +++ b/src/server/game/Movement/MovementGenerators/WaypointMovementGenerator.cpp @@ -263,6 +263,19 @@ void WaypointMovementGenerator::MovementInform(Creature* creature) AI->SummonMovementInform(creature, WAYPOINT_MOTION_TYPE, i_currentNode); } } + else + { + if (TempSummon* tempSummon = creature->ToTempSummon()) + { + if (Unit* owner = tempSummon->GetSummonerUnit()) + { + if (UnitAI* AI = owner->GetAI()) + { + AI->SummonMovementInform(creature, WAYPOINT_MOTION_TYPE, i_currentNode); + } + } + } + } } //----------------------------------------------------// diff --git a/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_hydross_the_unstable.cpp b/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_hydross_the_unstable.cpp index 3b90246b7b2e90..67e5e7d8595226 100644 --- a/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_hydross_the_unstable.cpp +++ b/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_hydross_the_unstable.cpp @@ -36,6 +36,8 @@ enum Spells SPELL_CLEANSING_FIELD = 37934, SPELL_BLUE_BEAM = 38015, SPELL_ELEMENTAL_SPAWNIN = 25035, + SPELL_PURIFY_ELEMENTAL = 36461, + SPELL_SUMMON_ELEMENTAL = 36459, SPELL_SUMMON_CORRUPTED1 = 38188, SPELL_SUMMON_CORRUPTED2 = 38189, @@ -68,24 +70,36 @@ enum Spells enum Misc { GROUP_ABILITIES = 1, + GROUP_OOC_PURIFY_ELEMENTALS = 2, + + NPC_PURIFIED_WATER_ELEMENTAL = 21260, NPC_PURE_SPAWN_OF_HYDROSS = 22035, + NPC_TAINTED_HYDROSS_ELEMENTAL = 21253 +}; + +enum WaterElementalPathIds +{ + PATH_CENTER = 5, + PATH_END = 12 }; struct boss_hydross_the_unstable : public BossAI { - boss_hydross_the_unstable(Creature* creature) : BossAI(creature, DATA_HYDROSS_THE_UNSTABLE) - { - scheduler.SetValidator([this] - { - return !me->HasUnitState(UNIT_STATE_CASTING); - }); - } + boss_hydross_the_unstable(Creature* creature) : BossAI(creature, DATA_HYDROSS_THE_UNSTABLE), _recentlySpoken(false) { } void Reset() override { - BossAI::Reset(); - + _Reset(); _recentlySpoken = false; + SummonTaintedElementalOOC(); + } + + void SummonTaintedElementalOOC() + { + me->m_Events.AddEventAtOffset([this] { + DoCastAOE(SPELL_SUMMON_ELEMENTAL); + SummonTaintedElementalOOC(); + }, 12s, 12s, GROUP_OOC_PURIFY_ELEMENTALS); } void JustReachedHome() override @@ -97,6 +111,27 @@ struct boss_hydross_the_unstable : public BossAI } } + void SummonMovementInform(Creature* summon, uint32 movementType, uint32 pathId) override + { + if (movementType == WAYPOINT_MOTION_TYPE) + { + if (pathId == PATH_CENTER) + { + summon->SetFacingToObject(me); + DoCast(summon, SPELL_PURIFY_ELEMENTAL); + + // Happens even if Hydross is dead, so completely detached to the spell, which is nothing but a dummy anyways. + summon->m_Events.AddEventAtOffset([summon] { + summon->UpdateEntry(NPC_PURIFIED_WATER_ELEMENTAL); + }, 1s); + } + else if (pathId == PATH_END) + { + summon->DespawnOrUnsummon(); + } + } + } + void SetForm(bool corrupt, bool initial) { scheduler.CancelGroup(GROUP_ABILITIES); @@ -193,6 +228,7 @@ struct boss_hydross_the_unstable : public BossAI BossAI::JustEngagedWith(who); Talk(SAY_AGGRO); SetForm(false, true); + me->m_Events.CancelEventGroup(GROUP_OOC_PURIFY_ELEMENTALS); scheduler.Schedule(1s, [this](TaskContext context) { @@ -222,14 +258,19 @@ struct boss_hydross_the_unstable : public BossAI void JustSummoned(Creature* summon) override { - summons.Summon(summon); + BossAI::JustSummoned(summon); + summon->CastSpell(summon, SPELL_ELEMENTAL_SPAWNIN, true); - summon->SetInCombatWithZone(); if (summon->GetEntry() == NPC_PURE_SPAWN_OF_HYDROSS) { summon->ApplySpellImmune(0, IMMUNITY_SCHOOL, SPELL_SCHOOL_MASK_FROST, true); } + else if (summon->GetEntry() == NPC_TAINTED_HYDROSS_ELEMENTAL) + { + summon->SetOwnerGUID(me->GetGUID()); + summon->GetMotionMaster()->MovePath(summon->GetEntry() * 10, false); + } else { summon->ApplySpellImmune(0, IMMUNITY_SCHOOL, SPELL_SCHOOL_MASK_NATURE, true);