diff options
author | Naddley <64811442+Naddley@users.noreply.github.com> | 2024-06-29 22:05:55 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-06-29 22:05:55 +0200 |
commit | 09325ef1053ccf63d1d2ffb0137e6e8d2863c49f (patch) | |
tree | e338fa55d63c39d1644078166794b609fa0c548d /src | |
parent | 557f756b82a4e519937bd3fd9bf439e9cb0ca617 (diff) |
Scripts/KingsRest: Implement Serpent pre boss event (#30066)
Diffstat (limited to 'src')
3 files changed, 342 insertions, 12 deletions
diff --git a/src/server/scripts/Zandalar/KingsRest/instance_kings_rest.cpp b/src/server/scripts/Zandalar/KingsRest/instance_kings_rest.cpp index d770aee54d4..3b9e119505d 100644 --- a/src/server/scripts/Zandalar/KingsRest/instance_kings_rest.cpp +++ b/src/server/scripts/Zandalar/KingsRest/instance_kings_rest.cpp @@ -38,8 +38,9 @@ DoorData const doorData[] = ObjectData const objectData[] = { - { GO_KINGS_REST_ENTRYWAY_DOOR, DATA_KINGS_REST_INTRO_DOOR }, - { 0, 0 } // END + { GO_KINGS_REST_ENTRYWAY_DOOR, DATA_KINGS_REST_INTRO_DOOR }, + { GO_KINGS_REST_LIQUID_GOLD_POOL, DATA_KINGS_REST_LIQUID_POOL }, + { 0, 0 } // END }; DungeonEncounterData const encounters[] = diff --git a/src/server/scripts/Zandalar/KingsRest/kings_rest.cpp b/src/server/scripts/Zandalar/KingsRest/kings_rest.cpp index c4cda8e23e6..dcd18da9c40 100644 --- a/src/server/scripts/Zandalar/KingsRest/kings_rest.cpp +++ b/src/server/scripts/Zandalar/KingsRest/kings_rest.cpp @@ -19,7 +19,9 @@ #include "AreaTriggerAI.h" #include "Conversation.h" #include "GameObject.h" +#include "GameObjectAI.h" #include "InstanceScript.h" +#include "Map.h" #include "ScriptMgr.h" #include "ScriptedCreature.h" #include "SpellAuras.h" @@ -31,25 +33,41 @@ enum KingsRestData { // Creature - NPC_SHADOW_OF_ZUL = 137020, + NPC_SHADOW_OF_ZUL = 137020, // Creature text - SAY_ANIMATED_GUARDIAN_ENGAGE = 0, + SAY_ANIMATED_GUARDIAN_ENGAGE = 0, + SAY_ZUL_PRE_BOSS_EVENT_SPAWN = 0, // DisplayIDs - DISPLAY_INVISIBLE_ZUL = 11686, + DISPLAY_INVISIBLE_ZUL = 11686, // Spell Visuals - SPELL_VISUAL_ZUL_OPEN_GOB = 77330, + SPELL_VISUAL_ZUL_OPEN_GOB = 77330, // Conversation - CONV_ZUL_KINGS_REST_INTRO = 7690, + CONV_ZUL_KINGS_REST_INTRO = 7690, + + // Spawngroups + SPAWN_GROUP_PRE_FIRST_BOSS = 1255, // Spells - SPELL_ZUL_SHADOWFORM = 269058, - SPELL_SUPPRESSION_SLAM_SELECTOR = 270002, - SPELL_SUPPRESSION_SLAM_DAMAGE = 270003, - SPELL_RELEASED_INHIBITORS = 270016 + SPELL_ZUL_SHADOWFORM = 269058, + SPELL_ZUL_TRASH_EVENT_STATE = 269905, + SPELL_ZUL_DESPAWN_COSMETIC_TRASH = 270692, + SPELL_ZUL_SUMMON_VISUAL = 269619, + SPELL_ZUL_SUMMON_VISUAL_CHANNEL = 269623, + SPELL_SUPPRESSION_SLAM_SELECTOR = 270002, + SPELL_SUPPRESSION_SLAM_DAMAGE = 270003, + SPELL_RELEASED_INHIBITORS = 270016, + SPELL_GUST_SLASH = 269931, + SPELL_GUST_SLASH_DAMAGE = 269932, + SPELL_DEATHLY_CHILL = 269973, + SPELL_SHADOW_BOLT_VOLLEY = 269972, + SPELL_ANCESTRAL_FURY = 269976, + SPELL_VIGILANT_DEFENSE = 269928, + SPELL_MINION_OF_ZUL_FIXATE = 269936, + SPELL_BOUND_BY_SHADOW = 269935 }; constexpr Position ShadowOfZulIntroSpawnPosition = { -944.9617f, 2646.5268f, 832.8684f, 4.716575f }; @@ -262,13 +280,322 @@ class spell_kings_rest_pit_of_despair : public AuraScript } }; +constexpr Position ShadowOfZulSerpentBossEventSpawnPosition = { -1066.0365f, 2643.302f, 819.37024f, 5.028946f }; + +// 288466 - Serpentine Seal +struct go_kings_rest_serpentine_seal : public GameObjectAI +{ + go_kings_rest_serpentine_seal(GameObject* go) : GameObjectAI(go) { } + + bool OnGossipHello(Player* /*player*/) override + { + me->UseDoorOrButton(); + _scheduler.Schedule(3s, [this](TaskContext) + { + if (TempSummon* zul = me->SummonCreature(NPC_SHADOW_OF_ZUL, ShadowOfZulSerpentBossEventSpawnPosition)) + zul->SetScriptStringId("SerpentBossEvent"); + }); + return true; + } + + void UpdateAI(uint32 diff) override + { + _scheduler.Update(diff); + } + +private: + TaskScheduler _scheduler; +}; + +// 137020 - Shadow of Zul +struct npc_kings_rest_shadow_of_zul : public ScriptedAI +{ + npc_kings_rest_shadow_of_zul(Creature* creature) : ScriptedAI(creature) { } + + void JustAppeared() override + { + if (me->HasStringId("SerpentBossEvent")) + TriggerSerpentBossEvent(); + } + + void TriggerSerpentBossEvent() + { + Seconds delay = 1s; + + _scheduler.Schedule(delay, [this](TaskContext) + { + Talk(SAY_ZUL_PRE_BOSS_EVENT_SPAWN); + me->CastSpell(nullptr, SPELL_ZUL_TRASH_EVENT_STATE, false); + me->CastSpell(nullptr, SPELL_ZUL_DESPAWN_COSMETIC_TRASH, false); + if (InstanceScript* instance = me->GetInstanceScript()) + { + if (GameObject* pool = instance->GetGameObject(DATA_KINGS_REST_LIQUID_POOL)) + pool->SetGoState(GO_STATE_ACTIVE); + } + }); + + delay += 9s; + + _scheduler.Schedule(delay, [this](TaskContext) + { + std::vector<WorldObject*> spawnedCreatures; + me->GetMap()->SpawnGroupSpawn(SPAWN_GROUP_PRE_FIRST_BOSS, false, false, &spawnedCreatures); + for (WorldObject* obj : spawnedCreatures) + { + Creature* creature = obj->ToCreature(); + if (!creature) + continue; + + me->CastSpell(creature, SPELL_ZUL_SUMMON_VISUAL_CHANNEL, false); + } + }); + + delay += 5s; + + _scheduler.Schedule(delay, [this](TaskContext) + { + me->RemoveAurasDueToSpell(SPELL_ZUL_SHADOWFORM); + }); + + delay += 1s; + + _scheduler.Schedule(delay, [this](TaskContext) + { + me->SetDisplayId(DISPLAY_INVISIBLE_ZUL); + me->DespawnOrUnsummon(1s); + }); + } + + void UpdateAI(uint32 diff) override + { + _scheduler.Update(diff); + } + +private: + TaskScheduler _scheduler; +}; + +struct npc_kings_rest_temple_basic : public ScriptedAI +{ + npc_kings_rest_temple_basic(Creature* creature) : ScriptedAI(creature) { } + + void JustAppeared() override + { + me->CastSpell(me, SPELL_ZUL_SUMMON_VISUAL, false); + } +}; + +enum ShadowBorneWarriorEvent +{ + EVENT_GUST_SLASH = 1 +}; + +// 134157 - Shadow-Borne Warrior +struct npc_kings_rest_shadow_borne_warrior : public npc_kings_rest_temple_basic +{ + npc_kings_rest_shadow_borne_warrior(Creature* creature) : npc_kings_rest_temple_basic(creature) { } + + void JustEngagedWith(Unit* /*who*/) override + { + _events.ScheduleEvent(EVENT_GUST_SLASH, 17s); + } + + void Reset() override + { + _events.Reset(); + } + + void UpdateAI(uint32 diff) override + { + if (!UpdateVictim()) + return; + + _events.Update(diff); + + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + + while (uint32 eventId = _events.ExecuteEvent()) + { + switch (eventId) + { + case EVENT_GUST_SLASH: + DoCast(SPELL_GUST_SLASH); + _events.ScheduleEvent(EVENT_GUST_SLASH, 17s); + break; + default: + break; + } + } + } + +private: + EventMap _events; +}; + +enum ShadowBorneWitchDoctorEvent +{ + EVENT_DEATHLY_CHILL = 1, + EVENT_SHADOW_BOLT_VOLLEY +}; + +// 134174 - Shadow-Borne Witch Doctor +struct npc_kings_rest_shadow_borne_witch_doctor : public npc_kings_rest_temple_basic +{ + npc_kings_rest_shadow_borne_witch_doctor(Creature* creature) : npc_kings_rest_temple_basic(creature) { } + + void JustEngagedWith(Unit* /*who*/) override + { + _events.ScheduleEvent(EVENT_DEATHLY_CHILL, 5s); + _events.ScheduleEvent(EVENT_SHADOW_BOLT_VOLLEY, 17s); + } + + void Reset() override + { + _events.Reset(); + } + + void UpdateAI(uint32 diff) override + { + if (!UpdateVictim()) + return; + + _events.Update(diff); + + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + + while (uint32 eventId = _events.ExecuteEvent()) + { + switch (eventId) + { + case EVENT_DEATHLY_CHILL: + DoCastVictim(SPELL_DEATHLY_CHILL); + _events.ScheduleEvent(EVENT_DEATHLY_CHILL, 2s + 500ms); + break; + case EVENT_SHADOW_BOLT_VOLLEY: + DoCast(SPELL_SHADOW_BOLT_VOLLEY); + _events.ScheduleEvent(EVENT_SHADOW_BOLT_VOLLEY, 16s); + break; + default: + break; + } + + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + } + } + +private: + EventMap _events; +}; + +enum ShadowBorneChampionEvent +{ + EVENT_ANCESTRAL_FURY = 1, + EVENT_VIGILANT_DEFENSE +}; + +// 134158 - Shadow-Borne Champion +struct npc_kings_rest_shadow_borne_champion : public npc_kings_rest_temple_basic +{ + npc_kings_rest_shadow_borne_champion(Creature* creature) : npc_kings_rest_temple_basic(creature) { } + + void JustEngagedWith(Unit* /*who*/) override + { + _events.ScheduleEvent(EVENT_ANCESTRAL_FURY, 35s); + _events.ScheduleEvent(EVENT_VIGILANT_DEFENSE, 21s); + } + + void Reset() override + { + _events.Reset(); + } + + void UpdateAI(uint32 diff) override + { + if (!UpdateVictim()) + return; + + _events.Update(diff); + + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + + while (uint32 eventId = _events.ExecuteEvent()) + { + switch (eventId) + { + case EVENT_ANCESTRAL_FURY: + DoCast(SPELL_ANCESTRAL_FURY); + _events.ScheduleEvent(EVENT_ANCESTRAL_FURY, 30s); + break; + case EVENT_VIGILANT_DEFENSE: + DoCast(SPELL_VIGILANT_DEFENSE); + _events.ScheduleEvent(EVENT_VIGILANT_DEFENSE, 21s); + break; + default: + break; + } + + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + } + } + +private: + EventMap _events; +}; + +// 133943 - Minion of Zul +struct npc_kings_rest_minion_of_zul : public npc_kings_rest_temple_basic +{ + npc_kings_rest_minion_of_zul(Creature* creature) : npc_kings_rest_temple_basic(creature) { } + + void JustAppeared() override + { + if (me->HasStringId("TempleEvent")) + npc_kings_rest_temple_basic::JustAppeared(); + + DoCast(SPELL_BOUND_BY_SHADOW); + } + + void JustEngagedWith(Unit* /*who*/) override + { + DoCast(SPELL_MINION_OF_ZUL_FIXATE); + } +}; + +// 17933 - Gust Slash - Areatrigger +struct at_kings_rest_gust_slash : AreaTriggerAI +{ + at_kings_rest_gust_slash(AreaTrigger* areatrigger) : AreaTriggerAI(areatrigger) { } + + void OnUnitEnter(Unit* unit) override + { + if (!unit->IsPlayer()) + return; + + unit->CastSpell(nullptr, SPELL_GUST_SLASH_DAMAGE, true); + } +}; + void AddSC_kings_rest() { // Creature RegisterKingsRestCreatureAI(npc_kings_rest_animated_guardian); + RegisterKingsRestCreatureAI(npc_kings_rest_shadow_of_zul); + RegisterKingsRestCreatureAI(npc_kings_rest_shadow_borne_warrior); + RegisterKingsRestCreatureAI(npc_kings_rest_shadow_borne_witch_doctor); + RegisterKingsRestCreatureAI(npc_kings_rest_shadow_borne_champion); + RegisterKingsRestCreatureAI(npc_kings_rest_minion_of_zul); + + // GameObject + RegisterGameObjectAI(go_kings_rest_serpentine_seal); // Areatrigger RegisterAreaTriggerAI(at_kings_rest_trigger_intro_event_with_zul); + RegisterAreaTriggerAI(at_kings_rest_gust_slash); // Conversation new conversation_kings_rest_intro(); diff --git a/src/server/scripts/Zandalar/KingsRest/kings_rest.h b/src/server/scripts/Zandalar/KingsRest/kings_rest.h index b959bdb02b7..6f6c69bd620 100644 --- a/src/server/scripts/Zandalar/KingsRest/kings_rest.h +++ b/src/server/scripts/Zandalar/KingsRest/kings_rest.h @@ -40,6 +40,7 @@ enum KingsRestDataTypes // GameObjects DATA_KINGS_REST_INTRO_DOOR, + DATA_KINGS_REST_LIQUID_POOL, }; enum KingsRestCreatureIds @@ -56,7 +57,8 @@ enum KingsRestCreatureIds enum KingsRestGameObjectIds { GO_KINGS_REST_ENTRYWAY_DOOR = 282652, - GO_KINGS_REST_SERPENT_POST_DOOR = 287392 + GO_KINGS_REST_SERPENT_POST_DOOR = 287392, + GO_KINGS_REST_LIQUID_GOLD_POOL = 289347 }; template <class AI, class T> |