From 67d02d4f1e89196dc44612ff24cd6a492b84e173 Mon Sep 17 00:00:00 2001 From: Skjalf <47818697+Nyeriah@users.noreply.github.com> Date: Fri, 10 Mar 2023 14:32:18 -0300 Subject: [PATCH] =?UTF-8?q?refactor(Scripts/BlackMorass):=20Move=20the=20R?= =?UTF-8?q?ift=20handling=20to=20the=20creature=E2=80=A6=20(#15316)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../TheBlackMorass/boss_aeonus.cpp | 2 + .../instance_the_black_morass.cpp | 53 +-------------- .../TheBlackMorass/the_black_morass.cpp | 66 ++++++++++++++----- .../TheBlackMorass/the_black_morass.h | 2 +- 4 files changed, 52 insertions(+), 71 deletions(-) diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/TheBlackMorass/boss_aeonus.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/TheBlackMorass/boss_aeonus.cpp index 410b32ca1..e8c9a2ce9 100644 --- a/src/server/scripts/Kalimdor/CavernsOfTime/TheBlackMorass/boss_aeonus.cpp +++ b/src/server/scripts/Kalimdor/CavernsOfTime/TheBlackMorass/boss_aeonus.cpp @@ -55,6 +55,8 @@ struct boss_aeonus : public BossAI { Talk(SAY_ENTER); + me->SetReactState(REACT_DEFENSIVE); + if (Creature* medivh = instance->GetCreature(DATA_MEDIVH)) { me->SetHomePosition(medivh->GetPositionX() + 14.0f * cos(medivh->GetAngle(me)), medivh->GetPositionY() + 14.0f * std::sin(medivh->GetAngle(me)), medivh->GetPositionZ(), me->GetAngle(medivh)); diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/TheBlackMorass/instance_the_black_morass.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/TheBlackMorass/instance_the_black_morass.cpp index 762df4d07..62ecd0c15 100644 --- a/src/server/scripts/Kalimdor/CavernsOfTime/TheBlackMorass/instance_the_black_morass.cpp +++ b/src/server/scripts/Kalimdor/CavernsOfTime/TheBlackMorass/instance_the_black_morass.cpp @@ -171,13 +171,7 @@ public: DoUpdateWorldState(WORLD_STATE_BM_RIFT, ++_currentRift); - if (Creature* rift = instance->SummonCreature(NPC_TIME_RIFT, spawnPos)) - { - _scheduler.Schedule(6s, [this, rift](TaskContext) - { - SummonPortalKeeper(rift); - }); - } + instance->SummonCreature(NPC_TIME_RIFT, spawnPos); // Here we check if we have available rift spots. if (_currentRift < 18) @@ -400,51 +394,6 @@ public: return 0; } - void SummonPortalKeeper(Creature* rift) - { - if (!rift) - { - return; - } - - int32 entry = 0; - switch (_currentRift) - { - case 6: - entry = GetBossState(DATA_CHRONO_LORD_DEJA) == DONE ? (instance->IsHeroic() ? NPC_INFINITE_CHRONO_LORD : -NPC_CHRONO_LORD_DEJA) : NPC_CHRONO_LORD_DEJA; - break; - case 12: - entry = GetBossState(DATA_TEMPORUS) == DONE ? (instance->IsHeroic() ? NPC_INFINITE_TIMEREAVER : -NPC_TEMPORUS) : NPC_TEMPORUS; - break; - case 18: - entry = NPC_AEONUS; - break; - default: - entry = RAND(NPC_RIFT_KEEPER_WARLOCK, NPC_RIFT_KEEPER_MAGE, NPC_RIFT_LORD, NPC_RIFT_LORD_2); - break; - } - - Position pos = rift->GetNearPosition(10.0f, 2 * M_PI * rand_norm()); - - if (Creature* summon = rift->SummonCreature(std::abs(entry), pos, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 3 * MINUTE * IN_MILLISECONDS)) - { - if (entry < 0) - { - summon->SetLootMode(0); - } - - if (summon->GetEntry() != NPC_AEONUS) - { - rift->CastSpell(summon, SPELL_RIFT_CHANNEL, false); - } - else - { - summon->SetReactState(REACT_DEFENSIVE); - _scheduler.CancelGroup(CONTEXT_GROUP_RIFTS); - } - } - } - void Update(uint32 diff) override { _scheduler.Update(diff); diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/TheBlackMorass/the_black_morass.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/TheBlackMorass/the_black_morass.cpp index cab4a86c8..02ed5e273 100644 --- a/src/server/scripts/Kalimdor/CavernsOfTime/TheBlackMorass/the_black_morass.cpp +++ b/src/server/scripts/Kalimdor/CavernsOfTime/TheBlackMorass/the_black_morass.cpp @@ -245,7 +245,8 @@ private: enum timeRift { EVENT_SUMMON_AT_RIFT = 1, - EVENT_CHECK_DEATH = 2 + EVENT_CHECK_DEATH = 2, + EVENT_SUMMON_BOSS = 3 }; struct npc_time_rift : public NullCreatureAI @@ -257,14 +258,14 @@ struct npc_time_rift : public NullCreatureAI void Reset() override { - if (_instance->GetData(DATA_RIFT_NUMBER) >= 18) + if (_instance->GetData(DATA_RIFT_NUMBER) > 18) { me->DespawnOrUnsummon(30000); return; } - events.ScheduleEvent(EVENT_SUMMON_AT_RIFT, 16000); - events.ScheduleEvent(EVENT_CHECK_DEATH, 8000); + events.ScheduleEvent(EVENT_SUMMON_AT_RIFT, 16s); + events.ScheduleEvent(EVENT_SUMMON_BOSS, 6s); } void JustSummoned(Creature* creature) override @@ -306,31 +307,60 @@ struct npc_time_rift : public NullCreatureAI } } + void SummonedCreatureDies(Creature* creature, Unit* /*killer*/) override + { + if (creature->GetGUID() == _riftKeeperGUID) + { + me->DespawnOrUnsummon(0); + } + } + void UpdateAI(uint32 diff) override { events.Update(diff); switch (events.ExecuteEvent()) { case EVENT_SUMMON_AT_RIFT: - DoSelectSummon(); - events.ScheduleEvent(EVENT_SUMMON_AT_RIFT, 15000); - break; - case EVENT_CHECK_DEATH: - if (!me->HasUnitState(UNIT_STATE_CASTING)) + if (_riftKeeperGUID.GetEntry() != NPC_AEONUS) { - Creature* riftKeeper = ObjectAccessor::GetCreature(*me, _riftKeeperGUID); - if (!riftKeeper || !riftKeeper->IsAlive()) - { - me->DespawnOrUnsummon(0); + DoSelectSummon(); + events.ScheduleEvent(EVENT_SUMMON_AT_RIFT, 15000); + } + break; + case EVENT_SUMMON_BOSS: + { + int32 entry = 0; + switch (_instance->GetData(DATA_RIFT_NUMBER)) + { + case 6: + entry = _instance->GetBossState(DATA_CHRONO_LORD_DEJA) == DONE ? (me->GetMap()->IsHeroic() ? NPC_INFINITE_CHRONO_LORD : -NPC_CHRONO_LORD_DEJA) : NPC_CHRONO_LORD_DEJA; break; - } - else + case 12: + entry = _instance->GetBossState(DATA_TEMPORUS) == DONE ? (me->GetMap()->IsHeroic() ? NPC_INFINITE_TIMEREAVER : -NPC_TEMPORUS) : NPC_TEMPORUS; + break; + case 18: + entry = NPC_AEONUS; + break; + default: + entry = RAND(NPC_RIFT_KEEPER_WARLOCK, NPC_RIFT_KEEPER_MAGE, NPC_RIFT_LORD, NPC_RIFT_LORD_2); + break; + } + + Position pos = me->GetNearPosition(10.0f, 2 * M_PI * rand_norm()); + + if (Creature* summon = me->SummonCreature(std::abs(entry), pos, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 3 * MINUTE * IN_MILLISECONDS)) + { + if (entry < 0) { - me->CastSpell(riftKeeper, SPELL_RIFT_CHANNEL, false); + summon->SetLootMode(0); + } + + if (summon->GetEntry() != NPC_AEONUS) + { + me->CastSpell(summon, SPELL_RIFT_CHANNEL, false); } } - events.ScheduleEvent(EVENT_CHECK_DEATH, 500); - break; + } } } diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/TheBlackMorass/the_black_morass.h b/src/server/scripts/Kalimdor/CavernsOfTime/TheBlackMorass/the_black_morass.h index 5fd011238..f621c1488 100644 --- a/src/server/scripts/Kalimdor/CavernsOfTime/TheBlackMorass/the_black_morass.h +++ b/src/server/scripts/Kalimdor/CavernsOfTime/TheBlackMorass/the_black_morass.h @@ -42,7 +42,7 @@ enum DataTypes DATA_RIFT_NUMBER = 14, DATA_SUMMONED_NPC = 20, - DATA_DELETED_NPC = 21, + DATA_DELETED_NPC = 21 }; enum WorldStateIds