From e8b76f2625fdb7181d857b60890557566ac650c1 Mon Sep 17 00:00:00 2001 From: UltraNix <80540499+UltraNix@users.noreply.github.com> Date: Sat, 18 Feb 2023 14:16:53 +0100 Subject: [PATCH] fix(Scripts/BlackMorass): Implemented wipe event. (#14860) --- .../instance_the_black_morass.cpp | 135 +++++++++++++++--- .../TheBlackMorass/the_black_morass.cpp | 36 +---- .../TheBlackMorass/the_black_morass.h | 33 ++++- 3 files changed, 150 insertions(+), 54 deletions(-) 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 876dc4a7d..a1539a192 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 @@ -116,6 +116,7 @@ public: case NPC_INFINITE_CRONOMANCER: case NPC_INFINITE_EXECUTIONER: case NPC_INFINITE_VANQUISHER: + case NPC_DP_BEAM_STALKER: encounterNPCs.insert(creature->GetGUID()); break; } @@ -150,26 +151,36 @@ public: switch (type) { case TYPE_AEONUS: + { + encounters[type] = DONE; + SaveToDB(); + + if (Creature* medivh = instance->GetCreature(_medivhGUID)) { - encounters[type] = DONE; - SaveToDB(); - - if (Creature* medivh = instance->GetCreature(_medivhGUID)) - medivh->AI()->DoAction(ACTION_OUTRO); - - Map::PlayerList const& players = instance->GetPlayers(); - if (!players.IsEmpty()) - for (Map::PlayerList::const_iterator itr = players.begin(); itr != players.end(); ++itr) - if (Player* player = itr->GetSource()) - { - if (player->GetQuestStatus(QUEST_OPENING_PORTAL) == QUEST_STATUS_INCOMPLETE) - player->AreaExploredOrEventHappens(QUEST_OPENING_PORTAL); - - if (player->GetQuestStatus(QUEST_MASTER_TOUCH) == QUEST_STATUS_INCOMPLETE) - player->AreaExploredOrEventHappens(QUEST_MASTER_TOUCH); - } - break; + medivh->AI()->DoAction(ACTION_OUTRO); } + + Map::PlayerList const& players = instance->GetPlayers(); + if (!players.IsEmpty()) + { + for (Map::PlayerList::const_iterator itr = players.begin(); itr != players.end(); ++itr) + { + if (Player* player = itr->GetSource()) + { + if (player->GetQuestStatus(QUEST_OPENING_PORTAL) == QUEST_STATUS_INCOMPLETE) + { + player->AreaExploredOrEventHappens(QUEST_OPENING_PORTAL); + } + + if (player->GetQuestStatus(QUEST_MASTER_TOUCH) == QUEST_STATUS_INCOMPLETE) + { + player->AreaExploredOrEventHappens(QUEST_MASTER_TOUCH); + } + } + } + } + break; + } case TYPE_CHRONO_LORD_DEJA: case TYPE_TEMPORUS: encounters[type] = DONE; @@ -182,13 +193,36 @@ public: Events.RescheduleEvent(EVENT_NEXT_PORTAL, 4000); break; case DATA_MEDIVH: + { DoUpdateWorldState(WORLD_STATE_BM, 1); DoUpdateWorldState(WORLD_STATE_BM_SHIELD, _shieldPercent); DoUpdateWorldState(WORLD_STATE_BM_RIFT, _currentRift); Events.RescheduleEvent(EVENT_NEXT_PORTAL, 3000); + + for (ObjectGuid const& guid : encounterNPCs) + { + if (guid.GetEntry() == NPC_DP_BEAM_STALKER) + { + if (Creature* creature = instance->GetCreature(guid)) + { + if (!creature->IsAlive()) + { + creature->Respawn(true); + } + } + break; + } + } + break; + } case DATA_DAMAGE_SHIELD: { + if (_shieldPercent <= 0) + { + return; + } + _shieldPercent -= data; if (_shieldPercent < 0) { @@ -203,15 +237,20 @@ public: { if (medivh->IsAlive()) { - Unit::Kill(medivh, medivh); + medivh->SetImmuneToNPC(true); - // Xinef: delete all spawns - GuidSet eCopy = encounterNPCs; - for (ObjectGuid const& guid : eCopy) + if (medivh->IsAIEnabled) + { + medivh->AI()->Talk(SAY_MEDIVH_DEATH); + } + + Events.ScheduleEvent(EVENT_WIPE_1, 4s); + + for (ObjectGuid const& guid : encounterNPCs) { if (Creature* creature = instance->GetCreature(guid)) { - creature->DespawnOrUnsummon(); + creature->InterruptNonMeleeSpells(true); } } } @@ -219,6 +258,8 @@ public: } break; } + default: + break; } } @@ -325,6 +366,54 @@ public: case EVENT_SUMMON_KEEPER: SummonPortalKeeper(); break; + case EVENT_WIPE_1: + if (Creature* medivh = instance->GetCreature(_medivhGUID)) + { + medivh->RemoveAllAuras(); + } + Events.ScheduleEvent(EVENT_WIPE_2, 500ms); + break; + case EVENT_WIPE_2: + if (Creature* medivh = instance->GetCreature(_medivhGUID)) + { + medivh->KillSelf(false); + + GuidSet encounterNPCSCopy = encounterNPCs; + for (ObjectGuid const& guid : encounterNPCSCopy) + { + switch (guid.GetEntry()) + { + case NPC_TIME_RIFT: + case NPC_DP_EMITTER_STALKER: + case NPC_DP_CRYSTAL_STALKER: + case NPC_DP_BEAM_STALKER: + if (Creature* creature = instance->GetCreature(guid)) + { + creature->DespawnOrUnsummon(); + } + break; + default: + break; + } + } + } + Events.ScheduleEvent(EVENT_WIPE_3, 2s); + break; + case EVENT_WIPE_3: + { + GuidSet encounterNPCSCopy = encounterNPCs; + for (ObjectGuid const& guid : encounterNPCSCopy) + { + if (Creature* creature = instance->GetCreature(guid)) + { + creature->CastSpell(creature, SPELL_TELEPORT_VISUAL, true); + creature->DespawnOrUnsummon(1200ms, 0s); + } + } + break; + } + default: + break; } } 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 b3a27299b..cb4abba8f 100644 --- a/src/server/scripts/Kalimdor/CavernsOfTime/TheBlackMorass/the_black_morass.cpp +++ b/src/server/scripts/Kalimdor/CavernsOfTime/TheBlackMorass/the_black_morass.cpp @@ -22,33 +22,8 @@ #include "ScriptedCreature.h" #include "ScriptedGossip.h" -enum medivhSays -{ - SAY_ENTER = 0, - SAY_DEATH = 5, - SAY_WIN = 6, - SAY_ORCS_ENTER = 7, - - SAY_ORCS_ANSWER = 0 -}; - -enum medivhSpells -{ - SPELL_MANA_SHIELD = 31635, - SPELL_MEDIVH_CHANNEL = 31556, - SPELL_BLACK_CRYSTAL = 32563, - SPELL_PORTAL_CRYSTALS = 32564, - SPELL_BANISH_PURPLE = 32566, - SPELL_BANISH_GREEN = 32567, - - SPELL_CORRUPT = 31326, - SPELL_CORRUPT_AEONUS = 37853, -}; - enum medivhMisc { - NPC_DP_EMITTER_STALKER = 18582, - NPC_DP_CRYSTAL_STALKER = 18553, NPC_SHADOW_COUNCIL_ENFORCER = 17023, GO_DARK_PORTAL = 185103, @@ -120,6 +95,8 @@ struct npc_medivh_bm : public ScriptedAI { me->CastSpell(me, SPELL_MEDIVH_CHANNEL, false); } + + me->SetImmuneToNPC(false); } void JustSummoned(Creature* summon) override @@ -156,7 +133,7 @@ struct npc_medivh_bm : public ScriptedAI if (who->GetTypeId() == TYPEID_PLAYER && me->IsWithinDistInMap(who, 20.0f)) { - Talk(SAY_ENTER); + Talk(SAY_MEDIVH_ENTER); _instance->SetData(DATA_MEDIVH, 1); me->CastSpell(me, SPELL_MEDIVH_CHANNEL, false); @@ -189,7 +166,6 @@ struct npc_medivh_bm : public ScriptedAI { me->SetRespawnTime(DAY); events.Reset(); - Talk(SAY_DEATH); } void UpdateAI(uint32 diff) override @@ -216,7 +192,7 @@ struct npc_medivh_bm : public ScriptedAI break; case EVENT_OUTRO_1: me->SetFacingTo(6.21f); - Talk(SAY_WIN); + Talk(SAY_MEDIVH_WIN); events.ScheduleEvent(EVENT_OUTRO_2, 17000); break; case EVENT_OUTRO_2: @@ -240,14 +216,14 @@ struct npc_medivh_bm : public ScriptedAI events.ScheduleEvent(EVENT_OUTRO_7, 7000); break; case EVENT_OUTRO_7: - Talk(SAY_ORCS_ENTER); + Talk(SAY_MEDIVH_ORCS_ENTER); events.ScheduleEvent(EVENT_OUTRO_8, 7000); break; case EVENT_OUTRO_8: if (Creature* cr = me->FindNearestCreature(NPC_SHADOW_COUNCIL_ENFORCER, 20.0f)) { cr->SetFacingTo(3.07f); - cr->AI()->Talk(SAY_ORCS_ANSWER); + cr->AI()->Talk(SAY_MEDIVH_ORCS_ANSWER); } 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 eb6aabd17..1d5325122 100644 --- a/src/server/scripts/Kalimdor/CavernsOfTime/TheBlackMorass/the_black_morass.h +++ b/src/server/scripts/Kalimdor/CavernsOfTime/TheBlackMorass/the_black_morass.h @@ -77,19 +77,50 @@ enum CreatureIds NPC_INFINITE_WHELP = 21818, NPC_INFINITE_CRONOMANCER = 17892, NPC_INFINITE_EXECUTIONER = 18994, - NPC_INFINITE_VANQUISHER = 18995 + NPC_INFINITE_VANQUISHER = 18995, + + NPC_DP_EMITTER_STALKER = 18582, + NPC_DP_CRYSTAL_STALKER = 18553, + NPC_DP_BEAM_STALKER = 18555 }; enum Misc { SPELL_RIFT_CHANNEL = 31387, + SPELL_TELEPORT_VISUAL = 7791, EVENT_NEXT_PORTAL = 1, EVENT_SUMMON_KEEPER = 2, + EVENT_WIPE_1 = 3, + EVENT_WIPE_2 = 4, + EVENT_WIPE_3 = 5, ACTION_OUTRO = 1 }; +enum medivhSays +{ + SAY_MEDIVH_ENTER = 0, + SAY_MEDIVH_DEATH = 5, + SAY_MEDIVH_WIN = 6, + SAY_MEDIVH_ORCS_ENTER = 7, + + SAY_MEDIVH_ORCS_ANSWER = 0 +}; + +enum medivhSpells +{ + SPELL_MANA_SHIELD = 31635, + SPELL_MEDIVH_CHANNEL = 31556, + SPELL_BLACK_CRYSTAL = 32563, + SPELL_PORTAL_CRYSTALS = 32564, + SPELL_BANISH_PURPLE = 32566, + SPELL_BANISH_GREEN = 32567, + + SPELL_CORRUPT = 31326, + SPELL_CORRUPT_AEONUS = 37853, +}; + template inline AI* GetTheBlackMorassAI(T* obj) {