aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorSorikoff <46191832+Sorikoff@users.noreply.github.com>2020-02-28 21:29:08 +0200
committerShauren <shauren.trinity@gmail.com>2021-12-22 15:11:35 +0100
commit32a91914064cbc22bd85a649bf251b6e6d7fff12 (patch)
tree4432b69bda52c5d35ec29d27e71e11b06aa20abb /src
parent3729c76523f42831a0bbe9c53d9594004860001a (diff)
Scripts/Ebon Hold: Bloody Breakout (#24126)
* Scripts/Ebon Hold: Bloody Breakout * Scripts/Ebon Hold: Bloody Breakout (part 2) * Improvements * Fail quest * Spacing * Update 9999_99_99_99_world.sql * Update 9999_99_99_99_world.sql * Rename 9999_99_99_99_world.sql to 2020_02_28_04_world.sql Co-authored-by: Giacomo Pozzoni <giacomopoz@gmail.com> (cherry picked from commit 2b14b720da2bc38c84f373cb3ff4bcc24c1ddcf0)
Diffstat (limited to 'src')
-rw-r--r--src/server/scripts/EasternKingdoms/ScarletEnclave/chapter2.cpp505
1 files changed, 255 insertions, 250 deletions
diff --git a/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter2.cpp b/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter2.cpp
index 0931549377b..feee69a1fc7 100644
--- a/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter2.cpp
+++ b/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter2.cpp
@@ -15,214 +15,315 @@
* with this program. If not, see <http://www.gnu.org/licenses/>.
*/
+#include "ScriptedGossip.h"
#include "ScriptMgr.h"
-#include "CreatureTextMgr.h"
#include "GameObject.h"
#include "MotionMaster.h"
#include "ObjectAccessor.h"
#include "Player.h"
#include "ScriptedEscortAI.h"
-#include "SpellInfo.h"
#include "SpellScript.h"
-/*######
-## npc_koltira_deathweaver
-######*/
+enum BloodyBreakoutTexts
+{
+ SAY_KOLTIRA_0 = 0,
+ SAY_KOLTIRA_1 = 1,
+ SAY_KOLTIRA_2 = 2,
+ SAY_KOLTIRA_3 = 3,
+ SAY_KOLTIRA_4 = 4,
+ SAY_KOLTIRA_5 = 5,
+ SAY_KOLTIRA_6 = 6,
+ SAY_KOLTIRA_7 = 7,
+ SAY_KOLTIRA_8 = 8,
+ SAY_KOLTIRA_9 = 9,
+ SAY_KOLTIRA_10 = 10,
+
+ SAY_VALROTH_0 = 0,
+ SAY_VALROTH_1 = 1,
+ SAY_VALROTH_2 = 2,
+ SAY_VALROTH_3 = 3,
+
+ TEXT_ID_EVENT = 13425
+};
-enum Koltira
+enum BloodyBreakoutEvents
{
- SAY_BREAKOUT1 = 0,
- SAY_BREAKOUT2 = 1,
- SAY_BREAKOUT3 = 2,
- SAY_BREAKOUT4 = 3,
- SAY_BREAKOUT5 = 4,
- SAY_BREAKOUT6 = 5,
- SAY_BREAKOUT7 = 6,
- SAY_BREAKOUT8 = 7,
- SAY_BREAKOUT9 = 8,
- SAY_BREAKOUT10 = 9,
-
- SPELL_KOLTIRA_TRANSFORM = 52899,
- SPELL_ANTI_MAGIC_ZONE = 52894,
-
- QUEST_BREAKOUT = 12727,
-
- NPC_CRIMSON_ACOLYTE = 29007,
- NPC_HIGH_INQUISITOR_VALROTH = 29001,
-
- //not sure about this id
- //NPC_DEATH_KNIGHT_MOUNT = 29201,
- MODEL_DEATH_KNIGHT_MOUNT = 25278
+ EVENT_INTRO_0 = 1,
+ EVENT_INTRO_1 = 2,
+ EVENT_INTRO_2 = 3,
+ EVENT_INTRO_3 = 4,
+ EVENT_INTRO_4 = 5,
+ EVENT_INTRO_5 = 6,
+ EVENT_INTRO_6 = 7,
+
+ EVENT_SPAWN_WAVE_1 = 8,
+ EVENT_SPAWN_WAVE_2 = 9,
+ EVENT_SPAWN_WAVE_3 = 10,
+ EVENT_SPAWN_VALROTH = 11,
+
+ EVENT_KOLTIRA_ADVICE = 12,
+ EVENT_OUTRO_1 = 13,
+ EVENT_OUTRO_2 = 14,
+ EVENT_OUTRO_3 = 15,
+ EVENT_OUTRO_4 = 16,
+
+ EVENT_CHECK_PLAYER = 17
};
-class npc_koltira_deathweaver : public CreatureScript
+enum BloodyBreakout
{
-public:
- npc_koltira_deathweaver() : CreatureScript("npc_koltira_deathweaver") { }
+ POINT_ID_1 = 1,
+ POINT_ID_2 = 2,
+ POINT_ID_6 = 6,
+ POINT_ID_10 = 10,
+
+ SUMMON_ACOLYTES_0 = 0,
+ SUMMON_ACOLYTES_1 = 1,
+ SUMMON_ACOLYTES_2 = 2,
+ SUMMON_VALROTH = 3,
+
+ QUEST_BLOODY_BREAKOUT = 12727,
+
+ NPC_FAKE_VALROTH = 29011,
+ NPC_VALROTH = 29001,
+ NPC_ACOLYTE = 29007,
+ NPC_KOLTIRA = 28912,
+ NPC_KOLTIRA_MOUNT = 25445,
+
+ SPELL_KOLTIRA_TRANSFORM = 52899,
+ SPELL_ANTI_MAGIC_ZONE = 52894,
+ SPELL_HERO_AGGRO = 53627
+};
- struct npc_koltira_deathweaverAI : public EscortAI
+Position const koltiraPos[3] =
+{
+ { 1653.36f, -6038.34f, 127.584f },
+ { 1653.765f, -6035.075f, 127.5844f },
+ { 1651.89f, -6037.101f, 127.5844f }
+};
+
+struct npc_koltira_deathweaver : public ScriptedAI
+{
+ npc_koltira_deathweaver(Creature* creature) : ScriptedAI(creature), _summons(me)
{
- npc_koltira_deathweaverAI(Creature* creature) : EscortAI(creature)
- {
- Initialize();
- me->SetReactState(REACT_DEFENSIVE);
- }
+ }
- void Initialize()
+ bool GossipHello(Player* player) override
+ {
+ ObjectGuid const guid = me->GetGUID();
+ _playerGUID = player->GetGUID();
+
+ if (me->IsQuestGiver())
+ player->PrepareQuestMenu(guid);
+
+ // override default gossip
+ if (_eventGossip)
{
- wave = 0;
- waveTimer = 3000;
- valrothGUID.Clear();
+ SendGossipMenuFor(player, TEXT_ID_EVENT, guid);
+ return true;
}
- void Reset() override
+ return false;
+ }
+
+ void QuestAccept(Player* /* player */, Quest const* quest) override
+ {
+ if (quest->GetQuestId() == QUEST_BLOODY_BREAKOUT)
{
- if (!HasEscortState(STATE_ESCORT_ESCORTING))
- {
- Initialize();
- me->LoadEquipment(0, true);
- me->RemoveAurasDueToSpell(SPELL_ANTI_MAGIC_ZONE);
- me->RemoveAurasDueToSpell(SPELL_KOLTIRA_TRANSFORM);
- me->RemoveUnitFlag(UNIT_FLAG_NON_ATTACKABLE);
- }
+ _events.ScheduleEvent(EVENT_INTRO_0, 500ms);
+ _events.ScheduleEvent(EVENT_CHECK_PLAYER, 5s);
}
+ }
+
+ void Reset() override
+ {
+ me->SetImmuneToNPC(true);
+ me->AddNpcFlag(UNIT_NPC_FLAG_GOSSIP);
+ me->SetStandState(UNIT_STAND_STATE_DEAD);
+ me->RemoveAllAuras();
+
+ _events.Reset();
+ _summons.DespawnAll();
+ _playerGUID.Clear();
+ _eventGossip = false;
+ }
- void WaypointReached(uint32 waypointId, uint32 /*pathId*/) override
+ void FakeValrothTalk(uint32 id)
+ {
+ if (Creature* fakeValroth = me->FindNearestCreature(NPC_FAKE_VALROTH, INSPECT_DISTANCE * 2))
+ fakeValroth->AI()->Talk(id);
+ }
+
+ void UpdateAI(uint32 diff) override
+ {
+ _events.Update(diff);
+
+ while (uint32 eventId = _events.ExecuteEvent())
{
- switch (waypointId)
+ switch (eventId)
{
- case 0:
- Talk(SAY_BREAKOUT1);
+ case EVENT_INTRO_0:
+ me->SetStandState(UNIT_STAND_STATE_SIT);
+ me->RemoveNpcFlag(UNIT_NPC_FLAG_GOSSIP);
+ Talk(SAY_KOLTIRA_0);
+
+ _events.ScheduleEvent(EVENT_INTRO_1, 5s);
break;
- case 1:
- me->SetStandState(UNIT_STAND_STATE_KNEEL);
+ case EVENT_INTRO_1:
+ me->SetStandState(UNIT_STAND_STATE_STAND);
+ Talk(SAY_KOLTIRA_1);
+
+ _events.ScheduleEvent(EVENT_INTRO_2, 2s);
break;
- case 2:
+ case EVENT_INTRO_2:
+ me->GetMotionMaster()->MoveJump(koltiraPos[0], 25.0f, 15.0f);
+
+ _events.ScheduleEvent(EVENT_INTRO_3, 2s);
+ break;
+
+ case EVENT_INTRO_3:
+ me->SetWalk(true);
+ me->GetMotionMaster()->MovePoint(POINT_ID_1, koltiraPos[1]);
+
+ break;
+ case EVENT_INTRO_4:
+ DoCastSelf(SPELL_KOLTIRA_TRANSFORM);
+ me->LoadEquipment(POINT_ID_1);
me->SetStandState(UNIT_STAND_STATE_STAND);
- DoCast(me, SPELL_KOLTIRA_TRANSFORM);
- me->LoadEquipment();
+ me->GetMotionMaster()->MovePoint(POINT_ID_2, koltiraPos[2], true, 3.839724f);
+
+ break;
+ case EVENT_INTRO_5:
+ Talk(SAY_KOLTIRA_2);
+ DoCastSelf(SPELL_ANTI_MAGIC_ZONE);
+
+ _events.ScheduleEvent(EVENT_INTRO_6, 4s);
break;
- case 3:
- SetEscortPaused(true);
- me->AddUnitFlag(UNIT_FLAG_NON_ATTACKABLE);
+ case EVENT_INTRO_6:
+ Talk(SAY_KOLTIRA_3);
me->SetStandState(UNIT_STAND_STATE_KNEEL);
- Talk(SAY_BREAKOUT2);
- DoCast(me, SPELL_ANTI_MAGIC_ZONE);
+ me->AddNpcFlag(UNIT_NPC_FLAG_GOSSIP);
+ _eventGossip = true;
+
break;
- case 4:
- SetRun(true);
+ case EVENT_SPAWN_WAVE_1:
+ me->SummonCreatureGroup(SUMMON_ACOLYTES_0);
+
+ _events.ScheduleEvent(EVENT_SPAWN_WAVE_2, 29s);
break;
- case 9:
- me->Mount(MODEL_DEATH_KNIGHT_MOUNT);
+ case EVENT_SPAWN_WAVE_2:
+ Talk(SAY_KOLTIRA_4);
+ FakeValrothTalk(SAY_VALROTH_1);
+ me->SummonCreatureGroup(SUMMON_ACOLYTES_1);
+
+ _events.ScheduleEvent(EVENT_SPAWN_WAVE_3, 21s);
break;
- case 10:
- me->Dismount();
+ case EVENT_SPAWN_WAVE_3:
+ Talk(SAY_KOLTIRA_5);
+ FakeValrothTalk(SAY_VALROTH_2);
+ me->SummonCreatureGroup(SUMMON_ACOLYTES_2);
+
+ _events.ScheduleEvent(EVENT_SPAWN_VALROTH, 24s);
break;
- }
- }
+ case EVENT_SPAWN_VALROTH:
+ Talk(SAY_KOLTIRA_6);
+ FakeValrothTalk(SAY_VALROTH_3);
+ me->SummonCreatureGroup(SUMMON_VALROTH);
- void JustSummoned(Creature* summoned) override
- {
- if (Player* player = GetPlayerForEscort())
- summoned->AI()->AttackStart(player);
+ _events.ScheduleEvent(EVENT_KOLTIRA_ADVICE, 8s, 16s);
+ break;
+ case EVENT_KOLTIRA_ADVICE:
+ if (_summons.HasEntry(NPC_VALROTH))
+ Talk(SAY_KOLTIRA_7);
- if (summoned->GetEntry() == NPC_HIGH_INQUISITOR_VALROTH)
- valrothGUID = summoned->GetGUID();
+ break;
+ case EVENT_OUTRO_1:
+ me->RemoveAurasDueToSpell(SPELL_ANTI_MAGIC_ZONE);
+ me->SetStandState(UNIT_STAND_STATE_STAND);
+ me->RemoveNpcFlag(UNIT_NPC_FLAG_GOSSIP);
+ Talk(SAY_KOLTIRA_8);
- summoned->SetImmuneToPC(false);
- }
+ _events.ScheduleEvent(EVENT_OUTRO_2, 7s);
+ _events.CancelEvent(EVENT_CHECK_PLAYER);
+ break;
+ case EVENT_OUTRO_2:
+ Talk(SAY_KOLTIRA_9);
- void SummonAcolyte(uint32 uiAmount)
- {
- for (uint32 i = 0; i < uiAmount; ++i)
- me->SummonCreature(NPC_CRIMSON_ACOLYTE, 1642.329f, -6045.818f, 127.583f, 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 5000);
- }
+ _events.ScheduleEvent(EVENT_OUTRO_3, 4s);
+ break;
+ case EVENT_OUTRO_3:
+ Talk(SAY_KOLTIRA_10);
- void UpdateAI(uint32 uiDiff) override
- {
- EscortAI::UpdateAI(uiDiff);
+ _events.ScheduleEvent(EVENT_OUTRO_4, 3s);
+ break;
+ case EVENT_OUTRO_4:
+ me->SetWalk(false);
+ me->SetImmuneToNPC(false);
+ DoCastSelf(SPELL_HERO_AGGRO);
+ me->GetMotionMaster()->MovePath(NPC_KOLTIRA, false);
- if (HasEscortState(STATE_ESCORT_PAUSED))
- {
- if (waveTimer <= uiDiff)
- {
- switch (wave)
+ break;
+ case EVENT_CHECK_PLAYER:
+ if (!_playerGUID)
+ return;
+
+ if (Player* player = ObjectAccessor::GetPlayer(*me, _playerGUID))
{
- case 0:
- Talk(SAY_BREAKOUT3);
- SummonAcolyte(3);
- waveTimer = 20000;
- break;
- case 1:
- Talk(SAY_BREAKOUT4);
- SummonAcolyte(3);
- waveTimer = 20000;
- break;
- case 2:
- Talk(SAY_BREAKOUT5);
- SummonAcolyte(4);
- waveTimer = 20000;
- break;
- case 3:
- Talk(SAY_BREAKOUT6);
- me->SummonCreature(NPC_HIGH_INQUISITOR_VALROTH, 1642.329f, -6045.818f, 127.583f, 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 1000);
- waveTimer = 1000;
- break;
- case 4:
+ if (!player->IsAlive() || !player->IsWithinDist(me, INTERACTION_DISTANCE * 6))
{
- Creature* temp = ObjectAccessor::GetCreature(*me, valrothGUID);
-
- if (!temp || !temp->IsAlive())
- {
- Talk(SAY_BREAKOUT8);
- waveTimer = 5000;
- }
- else
- {
- waveTimer = 2500;
- return;
- }
- break;
+ _summons.DespawnAll();
+ me->DespawnOrUnsummon(1s);
+ player->FailQuest(QUEST_BLOODY_BREAKOUT);
}
- case 5:
- Talk(SAY_BREAKOUT9);
- me->RemoveAurasDueToSpell(SPELL_ANTI_MAGIC_ZONE);
- me->RemoveUnitFlag(UNIT_FLAG_NON_ATTACKABLE);
- waveTimer = 2500;
- break;
- case 6:
- Talk(SAY_BREAKOUT10);
- SetEscortPaused(false);
- break;
}
- ++wave;
- }
- else
- waveTimer -= uiDiff;
+ _events.ScheduleEvent(EVENT_CHECK_PLAYER, 5s);
+ break;
}
}
+ }
- void QuestAccept(Player* player, Quest const* quest) override
+ void MovementInform(uint32 type, uint32 pointId) override
+ {
+ if (type == POINT_MOTION_TYPE)
{
- if (quest->GetQuestId() == QUEST_BREAKOUT)
+ if (pointId == POINT_ID_1)
{
- me->SetStandState(UNIT_STAND_STATE_STAND);
- Start(false, false, player->GetGUID());
+ me->SetStandState(UNIT_STAND_STATE_KNEEL);
+ FakeValrothTalk(SAY_VALROTH_0);
+
+ _events.ScheduleEvent(EVENT_SPAWN_WAVE_1, 1s);
+ _events.ScheduleEvent(EVENT_INTRO_4, 3s);
}
+ else if (pointId == POINT_ID_2)
+ _events.ScheduleEvent(EVENT_INTRO_5, 1s);
}
+ else
+ {
+ if (pointId == POINT_ID_6)
+ me->Mount(NPC_KOLTIRA_MOUNT);
+ }
+ }
- private:
- uint8 wave;
- uint32 waveTimer;
- ObjectGuid valrothGUID;
-
- };
+ void JustSummoned(Creature* summon) override
+ {
+ _summons.Summon(summon);
+ }
- CreatureAI* GetAI(Creature* creature) const override
+ void SummonedCreatureDespawn(Creature* summon) override
{
- return new npc_koltira_deathweaverAI(creature);
+ if (summon->GetEntry() == NPC_VALROTH)
+ _events.ScheduleEvent(EVENT_OUTRO_1, 1s);
+
+ _summons.Despawn(summon);
}
+
+private:
+ EventMap _events;
+ SummonList _summons;
+ ObjectGuid _playerGUID;
+
+ bool _eventGossip = false;
};
//Scarlet courier
@@ -321,101 +422,6 @@ public:
};
-//Koltira & Valroth- Breakout
-
-enum valroth
-{
- //SAY_VALROTH1 = 0, Unused
- SAY_VALROTH_AGGRO = 1,
- SAY_VALROTH_RAND = 2,
- SAY_VALROTH_DEATH = 3,
- SPELL_RENEW = 38210,
- SPELL_INQUISITOR_PENANCE = 52922,
- SPELL_VALROTH_SMITE = 52926,
- SPELL_SUMMON_VALROTH_REMAINS = 52929
-};
-
-class npc_high_inquisitor_valroth : public CreatureScript
-{
-public:
- npc_high_inquisitor_valroth() : CreatureScript("npc_high_inquisitor_valroth") { }
-
- CreatureAI* GetAI(Creature* creature) const override
- {
- return new npc_high_inquisitor_valrothAI(creature);
- }
-
- struct npc_high_inquisitor_valrothAI : public ScriptedAI
- {
- npc_high_inquisitor_valrothAI(Creature* creature) : ScriptedAI(creature)
- {
- Initialize();
- }
-
- void Initialize()
- {
- uiRenew_timer = 1000;
- uiInquisitor_Penance_timer = 2000;
- uiValroth_Smite_timer = 1000;
- }
-
- uint32 uiRenew_timer;
- uint32 uiInquisitor_Penance_timer;
- uint32 uiValroth_Smite_timer;
-
- void Reset() override
- {
- Initialize();
- }
-
- void JustEngagedWith(Unit* who) override
- {
- Talk(SAY_VALROTH_AGGRO);
- DoCast(who, SPELL_VALROTH_SMITE);
- }
-
- void UpdateAI(uint32 diff) override
- {
- if (uiRenew_timer <= diff)
- {
- Shout();
- DoCast(me, SPELL_RENEW);
- uiRenew_timer = urand(1000, 6000);
- } else uiRenew_timer -= diff;
-
- if (uiInquisitor_Penance_timer <= diff)
- {
- Shout();
- DoCastVictim(SPELL_INQUISITOR_PENANCE);
- uiInquisitor_Penance_timer = urand(2000, 7000);
- } else uiInquisitor_Penance_timer -= diff;
-
- if (uiValroth_Smite_timer <= diff)
- {
- Shout();
- DoCastVictim(SPELL_VALROTH_SMITE);
- uiValroth_Smite_timer = urand(1000, 6000);
- } else uiValroth_Smite_timer -= diff;
-
- DoMeleeAttackIfReady();
- }
-
- void Shout()
- {
- if (rand32() % 100 < 15)
- Talk(SAY_VALROTH_RAND);
- }
-
- void JustDied(Unit* killer) override
- {
- Talk(SAY_VALROTH_DEATH);
- if (killer)
- killer->CastSpell(me, SPELL_SUMMON_VALROTH_REMAINS, true);
- }
- };
-
-};
-
/*######
## npc_a_special_surprise
######*/
@@ -621,9 +627,8 @@ class spell_death_knight_devour_humanoid : public SpellScript
void AddSC_the_scarlet_enclave_c2()
{
+ RegisterCreatureAI(npc_koltira_deathweaver);
new npc_scarlet_courier();
- new npc_koltira_deathweaver();
- new npc_high_inquisitor_valroth();
new npc_a_special_surprise();
RegisterSpellScript(spell_death_knight_devour_humanoid);
}