aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorNaddley <64811442+Naddley@users.noreply.github.com>2024-06-29 22:05:55 +0200
committerGitHub <noreply@github.com>2024-06-29 22:05:55 +0200
commit09325ef1053ccf63d1d2ffb0137e6e8d2863c49f (patch)
treee338fa55d63c39d1644078166794b609fa0c548d /src
parent557f756b82a4e519937bd3fd9bf439e9cb0ca617 (diff)
Scripts/KingsRest: Implement Serpent pre boss event (#30066)
Diffstat (limited to 'src')
-rw-r--r--src/server/scripts/Zandalar/KingsRest/instance_kings_rest.cpp5
-rw-r--r--src/server/scripts/Zandalar/KingsRest/kings_rest.cpp345
-rw-r--r--src/server/scripts/Zandalar/KingsRest/kings_rest.h4
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>