diff options
10 files changed, 688 insertions, 82 deletions
diff --git a/sql/updates/world/2013_11_10_00_world_misc.sql b/sql/updates/world/2013_11_10_00_world_misc.sql new file mode 100644 index 00000000000..3898206978d --- /dev/null +++ b/sql/updates/world/2013_11_10_00_world_misc.sql @@ -0,0 +1,40 @@ +-- Creature text for Wrath-Scryer Soccothrates +SET @ENTRY = 20886; +DELETE FROM `creature_text` WHERE `entry`=@ENTRY AND `groupid` IN (7,8,9,10); +INSERT INTO `creature_text` (`entry`,`groupid`,`id`,`text`,`type`,`language`,`probability`,`emote`,`duration`,`sound`,`comment`) VALUES +(@ENTRY, 7, 0, 'Did you call on me?', 14, 0, 100, 397, 0, 11236, 'Wrath-Scryer Soccothrates - Conversation with Dalliah part 1'), +(@ENTRY, 8, 0, 'To do your heavy lifting, most likely.', 14, 0, 100, 396, 0, 0, 'Wrath-Scryer Soccothrates - Conversation with Dalliah part 2'), +(@ENTRY, 9, 0, 'Then I''ll commit myself to ignoring you.', 14, 0, 100, 396, 0, 0, 'Wrath-Scryer Soccothrates - Conversation with Dalliah part 3'), +(@ENTRY, 10, 0, 'You''re the one who should be-- Wait, we have company...', 14, 0, 100, 396, 0, 0, 'Wrath-Scryer Soccothrates - Conversation with Dalliah part 4'); + +-- Creature text for Dalliah the Doomsayer +SET @ENTRY = 20885; +DELETE FROM `creature_text` WHERE `entry`=@ENTRY AND `groupid` IN (8,9,10); +INSERT INTO `creature_text` (`entry`,`groupid`,`id`,`text`,`type`,`language`,`probability`,`emote`,`duration`,`sound`,`comment`) VALUES +(@ENTRY, 8, 0, 'Why would I call on you?', 14, 0, 100, 396, 0, 0, 'Dalliah the Doomsayer - Conversation with Soccothrates part 1'), +(@ENTRY, 9, 0, 'When I need someone to prance around like an overstuffed peacock, I''ll call on you.', 14, 0, 100, 396, 0, 0, 'Dalliah the Doomsayer - Conversation with Soccothrates part 2'), +(@ENTRY, 10, 0, 'What would you know about commitment, sheet-sah?', 14, 0, 100, 396, 0, 0, 'Dalliah the Doomsayer - Conversation with Soccothrates part 3'); + +-- Creature text updates +UPDATE `creature_text` SET `emote`=1 WHERE `entry`=20886 AND `groupid` IN (0,5); +UPDATE `creature_text` SET `emote`=1 WHERE `entry`=20885 AND `groupid` IN (0,6); +UPDATE `creature_text` SET `emote`=66 WHERE `entry`=20886 AND `groupid` IN (6); +UPDATE `creature_text` SET `emote`=66 WHERE `entry`=20885 AND `groupid` IN (7); +UPDATE `creature_text` SET `text`= 'As masters of blood, we are masters of life and death itself. Against us, even hope falls drained and lifeless.' WHERE `entry`=29196 AND `groupid`=8; +UPDATE `creature_text` SET `comment`= 'Wrath-Scryer Soccothrates - Knock Away' WHERE `entry`=20886 AND `groupid` IN (3); + +-- Add missing spelldifficulty_dbc values +DELETE FROM `spelldifficulty_dbc` WHERE `id` IN (36127,36123,36173,36144,35759,36051); +INSERT INTO `spelldifficulty_dbc` (`id`,`spellid0`,`spellid1`) VALUES +(36127,36127,39005),(36123,36123,39367), -- Zereketh the Unbound +(36173,36173,39009),(36144,36144,39013), -- Dalliah the Doomsayer +(35759,35759,39006),(36051,36051,39007); -- Wrath-Scryer Soccothrates + +UPDATE `creature_template` SET `AIName` = '', `ScriptName`= 'boss_zereketh_the_unbound' WHERE entry=20870; +UPDATE `creature_template` SET `AIName` = '', `ScriptName`= 'boss_dalliah_the_doomsayer' WHERE entry=20885; +UPDATE `creature_template` SET `AIName` = '', `ScriptName`= 'boss_wrath_scryer_soccothrates' WHERE entry=20886; +DELETE FROM creature_ai_scripts WHERE creature_id IN (20885,20886); +DELETE FROM smart_scripts WHERE entryorguid IN (20870); +DELETE FROM creature_ai_texts WHERE entry BETWEEN -28 AND -23; +DELETE FROM creature_ai_texts WHERE entry BETWEEN -80 AND -73; +UPDATE `creature` SET `spawndist`=5, `MovementType`=1 WHERE `id`=20870; diff --git a/src/server/game/Scripting/ScriptLoader.cpp b/src/server/game/Scripting/ScriptLoader.cpp index 17fb3f33eca..779c9be6c0e 100644 --- a/src/server/game/Scripting/ScriptLoader.cpp +++ b/src/server/game/Scripting/ScriptLoader.cpp @@ -619,6 +619,9 @@ void AddSC_boss_omor_the_unscarred(); void AddSC_boss_vazruden_the_herald(); void AddSC_instance_ramparts(); void AddSC_arcatraz(); //TK Arcatraz +void AddSC_boss_zereketh_the_unbound(); +void AddSC_boss_dalliah_the_doomsayer(); +void AddSC_boss_wrath_scryer_soccothrates(); void AddSC_boss_harbinger_skyriss(); void AddSC_instance_arcatraz(); void AddSC_boss_high_botanist_freywinn(); //TK Botanica @@ -1140,6 +1143,9 @@ void AddOutlandScripts() AddSC_boss_vazruden_the_herald(); AddSC_instance_ramparts(); AddSC_arcatraz(); //TK Arcatraz + AddSC_boss_zereketh_the_unbound(); + AddSC_boss_dalliah_the_doomsayer(); + AddSC_boss_wrath_scryer_soccothrates(); AddSC_boss_harbinger_skyriss(); AddSC_instance_arcatraz(); AddSC_boss_high_botanist_freywinn(); //TK Botanica diff --git a/src/server/scripts/Outland/CMakeLists.txt b/src/server/scripts/Outland/CMakeLists.txt index 84cbbc3c30c..45db8a80a26 100644 --- a/src/server/scripts/Outland/CMakeLists.txt +++ b/src/server/scripts/Outland/CMakeLists.txt @@ -68,6 +68,9 @@ set(scripts_STAT_SRCS Outland/TempestKeep/botanica/boss_high_botanist_freywinn.cpp Outland/TempestKeep/botanica/boss_warp_splinter.cpp Outland/TempestKeep/botanica/boss_laj.cpp + Outland/TempestKeep/arcatraz/boss_zereketh_the_unbound.cpp + Outland/TempestKeep/arcatraz/boss_dalliah_the_doomsayer.cpp + Outland/TempestKeep/arcatraz/boss_wrath_scryer_soccothrates.cpp Outland/TempestKeep/arcatraz/boss_harbinger_skyriss.cpp Outland/TempestKeep/arcatraz/instance_arcatraz.cpp Outland/TempestKeep/arcatraz/arcatraz.h diff --git a/src/server/scripts/Outland/TempestKeep/arcatraz/arcatraz.cpp b/src/server/scripts/Outland/TempestKeep/arcatraz/arcatraz.cpp index 9206636893c..8b3dc8f174c 100644 --- a/src/server/scripts/Outland/TempestKeep/arcatraz/arcatraz.cpp +++ b/src/server/scripts/Outland/TempestKeep/arcatraz/arcatraz.cpp @@ -103,10 +103,10 @@ class npc_millhouse_manastorm : public CreatureScript if (instance) { - if (instance->GetData(TYPE_WARDEN_2) == DONE) + if (instance->GetData(DATA_WARDEN_2) == DONE) Init = true; - if (instance->GetData(TYPE_HARBINGERSKYRISS) == DONE) + if (instance->GetData(DATA_HARBINGERSKYRISS) == DONE) Talk(SAY_COMPLETE); } } @@ -177,7 +177,7 @@ class npc_millhouse_manastorm : public CreatureScript break; case 7: if (instance) - instance->SetData(TYPE_WARDEN_2, DONE); + instance->SetData(DATA_WARDEN_2, DONE); Init = true; break; } @@ -305,7 +305,7 @@ class npc_warden_mellichar : public CreatureScript DoCast(me, SPELL_TARGET_OMEGA); if (instance) - instance->SetData(TYPE_HARBINGERSKYRISS, NOT_STARTED); + instance->SetData(DATA_HARBINGERSKYRISS, NOT_STARTED); } void AttackStart(Unit* /*who*/) OVERRIDE { } @@ -336,7 +336,7 @@ class npc_warden_mellichar : public CreatureScript if (instance) { - instance->SetData(TYPE_HARBINGERSKYRISS, IN_PROGRESS); + instance->SetData(DATA_HARBINGERSKYRISS, IN_PROGRESS); instance->HandleGameObject(instance->GetData64(DATA_SPHERE_SHIELD), false); IsRunning = true; } @@ -346,19 +346,19 @@ class npc_warden_mellichar : public CreatureScript { if (instance) { - if (Phase == 7 && instance->GetData(TYPE_WARDEN_4) == DONE) + if (Phase == 7 && instance->GetData(DATA_WARDEN_4) == DONE) return true; - if (Phase == 6 && instance->GetData(TYPE_WARDEN_3) == DONE) + if (Phase == 6 && instance->GetData(DATA_WARDEN_3) == DONE) return true; - if (Phase == 5 && instance->GetData(TYPE_WARDEN_2) == DONE) + if (Phase == 5 && instance->GetData(DATA_WARDEN_2) == DONE) return true; if (Phase == 4) return true; - if (Phase == 3 && instance->GetData(TYPE_WARDEN_1) == DONE) + if (Phase == 3 && instance->GetData(DATA_WARDEN_1) == DONE) return true; - if (Phase == 2 && instance->GetData(TYPE_HARBINGERSKYRISS) == IN_PROGRESS) + if (Phase == 2 && instance->GetData(DATA_HARBINGERSKYRISS) == IN_PROGRESS) return true; - if (Phase == 1 && instance->GetData(TYPE_HARBINGERSKYRISS) == IN_PROGRESS) + if (Phase == 1 && instance->GetData(DATA_HARBINGERSKYRISS) == IN_PROGRESS) return true; return false; } @@ -376,23 +376,23 @@ class npc_warden_mellichar : public CreatureScript { case 2: DoCast(me, SPELL_TARGET_ALPHA); - instance->SetData(TYPE_WARDEN_1, IN_PROGRESS); + instance->SetData(DATA_WARDEN_1, IN_PROGRESS); instance->HandleGameObject(instance->GetData64(DATA_SPHERE_SHIELD), false); break; case 3: DoCast(me, SPELL_TARGET_BETA); - instance->SetData(TYPE_WARDEN_2, IN_PROGRESS); + instance->SetData(DATA_WARDEN_2, IN_PROGRESS); break; case 5: DoCast(me, SPELL_TARGET_DELTA); - instance->SetData(TYPE_WARDEN_3, IN_PROGRESS); + instance->SetData(DATA_WARDEN_3, IN_PROGRESS); break; case 6: DoCast(me, SPELL_TARGET_GAMMA); - instance->SetData(TYPE_WARDEN_4, IN_PROGRESS); + instance->SetData(DATA_WARDEN_4, IN_PROGRESS); break; case 7: - instance->SetData(TYPE_WARDEN_5, IN_PROGRESS); + instance->SetData(DATA_WARDEN_5, IN_PROGRESS); break; } CanSpawn = true; @@ -408,7 +408,7 @@ class npc_warden_mellichar : public CreatureScript { if (instance) { - if (instance->GetData(TYPE_HARBINGERSKYRISS) == FAIL) + if (instance->GetData(DATA_HARBINGERSKYRISS) == FAIL) { Reset(); return; diff --git a/src/server/scripts/Outland/TempestKeep/arcatraz/arcatraz.h b/src/server/scripts/Outland/TempestKeep/arcatraz/arcatraz.h index 37839d4794d..038d94fc960 100644 --- a/src/server/scripts/Outland/TempestKeep/arcatraz/arcatraz.h +++ b/src/server/scripts/Outland/TempestKeep/arcatraz/arcatraz.h @@ -16,23 +16,49 @@ * with this program. If not, see <http://www.gnu.org/licenses/>. */ -#ifndef ARCATRAZ_H_ -#define ARCATRAZ_H_ +#ifndef ARCATRAZ_H +#define ARCATRAZ_H + +uint32 const EncounterCount = 13; + +#define AScriptName "instance_arcatraz" enum DataTypes { - TYPE_ZEREKETH = 1, - TYPE_DALLIAH = 2, - TYPE_SOCCOTHRATES = 3, - TYPE_HARBINGERSKYRISS = 4, - TYPE_WARDEN_1 = 5, - TYPE_WARDEN_2 = 6, - TYPE_WARDEN_3 = 7, - TYPE_WARDEN_4 = 8, - TYPE_WARDEN_5 = 9, - DATA_MELLICHAR = 10, - TYPE_SHIELD_OPEN = 11, - DATA_SPHERE_SHIELD = 12 + DATA_ZEREKETH = 1, + DATA_DALLIAH = 2, + DATA_SOCCOTHRATES = 3, + DATA_HARBINGERSKYRISS = 4, + DATA_WARDEN_1 = 5, + DATA_WARDEN_2 = 6, + DATA_WARDEN_3 = 7, + DATA_WARDEN_4 = 8, + DATA_WARDEN_5 = 9, + DATA_MELLICHAR = 10, + DATA_SHIELD_OPEN = 11, + DATA_SPHERE_SHIELD = 12, + DATA_CONVERSATION = 13 +}; + +enum CreaturesIds +{ + NPC_MELLICHAR = 20904, //skyriss will kill this unit + NPC_ALPHA_POD_TARGET = 21436, + NPC_DALLIAH = 20885, + NPC_SOCCOTHRATES = 20886 +}; + +enum GameObjectsIds +{ + CONTAINMENT_CORE_SECURITY_FIELD_ALPHA = 184318, //door opened when Wrath-Scryer Soccothrates dies + CONTAINMENT_CORE_SECURITY_FIELD_BETA = 184319, //door opened when Dalliah the Doomsayer dies + POD_ALPHA = 183961, //pod first boss wave + POD_BETA = 183963, //pod second boss wave + POD_DELTA = 183964, //pod third boss wave + POD_GAMMA = 183962, //pod fourth boss wave + POD_OMEGA = 183965, //pod fifth boss wave + WARDENS_SHIELD = 184802, // warden shield + SEAL_SPHERE = 184802 //shield 'protecting' mellichar }; -#endif // ARCATRAZ_H_ +#endif // ARCATRAZ_H diff --git a/src/server/scripts/Outland/TempestKeep/arcatraz/boss_dalliah_the_doomsayer.cpp b/src/server/scripts/Outland/TempestKeep/arcatraz/boss_dalliah_the_doomsayer.cpp new file mode 100644 index 00000000000..20cfb2f07f8 --- /dev/null +++ b/src/server/scripts/Outland/TempestKeep/arcatraz/boss_dalliah_the_doomsayer.cpp @@ -0,0 +1,165 @@ +/* + * Copyright (C) 2008-2013 TrinityCore <http://www.trinitycore.org/> + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2 of the License, or (at your + * option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along + * with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +/* ScriptData +SDName: boss_dalliah_the_doomsayer +SD%Complete: 95% +SDComment: soccothrates death left to script +SDCategory: Tempest Keep, The Arcatraz +EndScriptData */ + +#include "ScriptMgr.h" +#include "ScriptedCreature.h" +#include "arcatraz.h" + +enum Say +{ + SAY_AGGRO = 1, + SAY_SLAY = 2, + SAY_WHIRLWIND = 3, + SAY_HEAL = 4, + SAY_DEATH = 5, + SAY_SOCCOTHRATES_DEATH = 7, // To be scripted + + // boss_wrath_scryer_soccothrates + SAY_AGGRO_DALLIAH_FIRST = 0, + SAY_DALLIAH_25_PERCENT = 5 +}; + +enum Spells +{ + SPELL_GIFT_OF_THE_DOOMSAYER = 36173, + SPELL_WHIRLWIND = 36142, + SPELL_HEAL = 36144, + SPELL_SHADOW_WAVE = 39016 // Heroic only +}; + +enum Events +{ + EVENT_GIFT_OF_THE_DOOMSAYER = 1, + EVENT_WHIRLWIND = 2, + EVENT_HEAL = 3, + EVENT_SHADOW_WAVE = 4, // Heroic only + EVENT_ME_FIRST = 5 +}; + +class boss_dalliah_the_doomsayer : public CreatureScript +{ + public: + boss_dalliah_the_doomsayer() : CreatureScript("boss_dalliah_the_doomsayer") { } + + struct boss_dalliah_the_doomsayerAI : public BossAI + { + boss_dalliah_the_doomsayerAI(Creature* creature) : BossAI(creature, DATA_DALLIAH) { } + + void Reset() OVERRIDE + { + _Reset(); + } + + void JustDied(Unit* /*killer*/) OVERRIDE + { + _JustDied(); + Talk(SAY_DEATH); + } + + void EnterCombat(Unit* /*who*/) OVERRIDE + { + _EnterCombat(); + events.ScheduleEvent(EVENT_GIFT_OF_THE_DOOMSAYER, urand(1000, 4000)); + events.ScheduleEvent(EVENT_WHIRLWIND, urand(7000, 9000)); + if (IsHeroic()) + events.ScheduleEvent(EVENT_SHADOW_WAVE, urand(11000, 16000)); + events.ScheduleEvent(EVENT_ME_FIRST, 6000); + Talk(SAY_AGGRO); + + if (Creature* soccothrates = me->FindNearestCreature(NPC_SOCCOTHRATES, 100.0f, true)) + soccothratesGUID = soccothrates->GetGUID(); + } + + void KilledUnit(Unit* /*victim*/) OVERRIDE + { + Talk(SAY_SLAY); + } + + 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_GIFT_OF_THE_DOOMSAYER: + DoCastVictim(SPELL_GIFT_OF_THE_DOOMSAYER, true); + events.ScheduleEvent(EVENT_GIFT_OF_THE_DOOMSAYER, urand(16000, 21000)); + break; + case EVENT_WHIRLWIND: + DoCast(me, SPELL_WHIRLWIND); + Talk(SAY_WHIRLWIND); + events.ScheduleEvent(EVENT_WHIRLWIND, urand(19000, 21000)); + events.ScheduleEvent(EVENT_HEAL, 6000); + break; + case EVENT_HEAL: + DoCast(me, SPELL_HEAL); + Talk(SAY_HEAL); + break; + case EVENT_SHADOW_WAVE: + DoCastVictim(SPELL_SHADOW_WAVE, true); + events.ScheduleEvent(EVENT_SHADOW_WAVE, urand(11000, 16000)); + break; + case EVENT_ME_FIRST: + if (Creature* soccothrates = me->GetCreature(*me, soccothratesGUID)) + if (soccothrates->IsAlive() && !soccothrates->IsInCombat()) + soccothrates->AI()->Talk(SAY_AGGRO_DALLIAH_FIRST); + break; + default: + break; + } + } + + if (HealthBelowPct(25) && !soccothratesTaunt) + { + if (Creature* soccothrates = me->GetCreature(*me, soccothratesGUID)) + soccothrates->AI()->Talk(SAY_DALLIAH_25_PERCENT); + soccothratesTaunt = true; + } + + DoMeleeAttackIfReady(); + } + + private: + bool soccothratesTaunt; + uint64 soccothratesGUID; + }; + + CreatureAI* GetAI(Creature* creature) const OVERRIDE + { + return new boss_dalliah_the_doomsayerAI(creature); + } +}; + +void AddSC_boss_dalliah_the_doomsayer() +{ + new boss_dalliah_the_doomsayer(); +} diff --git a/src/server/scripts/Outland/TempestKeep/arcatraz/boss_harbinger_skyriss.cpp b/src/server/scripts/Outland/TempestKeep/arcatraz/boss_harbinger_skyriss.cpp index eda90d3b734..3748b704e0a 100644 --- a/src/server/scripts/Outland/TempestKeep/arcatraz/boss_harbinger_skyriss.cpp +++ b/src/server/scripts/Outland/TempestKeep/arcatraz/boss_harbinger_skyriss.cpp @@ -61,21 +61,15 @@ enum Spells class boss_harbinger_skyriss : public CreatureScript { public: + boss_harbinger_skyriss() : CreatureScript("boss_harbinger_skyriss") { } - boss_harbinger_skyriss() - : CreatureScript("boss_harbinger_skyriss") + struct boss_harbinger_skyrissAI : public BossAI { - } - struct boss_harbinger_skyrissAI : public ScriptedAI - { - boss_harbinger_skyrissAI(Creature* creature) : ScriptedAI(creature) + boss_harbinger_skyrissAI(Creature* creature) : BossAI(creature, DATA_HARBINGERSKYRISS) { - instance = creature->GetInstanceScript(); Intro = false; } - InstanceScript* instance; - bool Intro; bool IsImage33; bool IsImage66; @@ -117,8 +111,7 @@ class boss_harbinger_skyriss : public CreatureScript void JustDied(Unit* /*killer*/) OVERRIDE { Talk(SAY_DEATH); - if (instance) - instance->SetData(TYPE_HARBINGERSKYRISS, DONE); + _JustDied(); } void JustSummoned(Creature* summon) OVERRIDE @@ -137,7 +130,7 @@ class boss_harbinger_skyriss : public CreatureScript void KilledUnit(Unit* victim) OVERRIDE { //won't yell killing pet/other unit - if (victim->GetEntry() == 21436) + if (victim->GetEntry() == NPC_ALPHA_POD_TARGET) return; Talk(SAY_KILL); @@ -180,7 +173,7 @@ class boss_harbinger_skyriss : public CreatureScript //should have a better way to do this. possibly spell exist. mellic->setDeathState(JUST_DIED); mellic->SetHealth(0); - instance->SetData(TYPE_SHIELD_OPEN, IN_PROGRESS); + instance->SetData(DATA_SHIELD_OPEN, IN_PROGRESS); } ++Intro_Phase; Intro_Timer = 3000; diff --git a/src/server/scripts/Outland/TempestKeep/arcatraz/boss_wrath_scryer_soccothrates.cpp b/src/server/scripts/Outland/TempestKeep/arcatraz/boss_wrath_scryer_soccothrates.cpp new file mode 100644 index 00000000000..cef8a8b8e2d --- /dev/null +++ b/src/server/scripts/Outland/TempestKeep/arcatraz/boss_wrath_scryer_soccothrates.cpp @@ -0,0 +1,254 @@ +/* + * Copyright (C) 2008-2013 TrinityCore <http://www.trinitycore.org/> + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2 of the License, or (at your + * option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along + * with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +/* ScriptData +SDName: boss_wrath_scryer_soccothrates +SD%Complete: 85% +SDComment: charge and dalliah death left to script +SDCategory: Tempest Keep, The Arcatraz +EndScriptData */ + +#include "ScriptMgr.h" +#include "ScriptedCreature.h" +#include "arcatraz.h" + +enum Say +{ + // boss_wrath_scryer_soccothrates + SAY_AGGRO = 1, + SAY_SLAY = 2, + SAY_KNOCK_AWAY = 3, + SAY_DEATH = 4, + SAY_DALLIAH_DEATH = 6, // To be scripted + SAY_SOCCOTHRATES_CONVO_1 = 7, + SAY_SOCCOTHRATES_CONVO_2 = 8, + SAY_SOCCOTHRATES_CONVO_3 = 9, + SAY_SOCCOTHRATES_CONVO_4 = 10, + + // boss_dalliah_the_doomsayer + SAY_AGGRO_SOCCOTHRATES_FIRST = 0, + SAY_SOCCOTHRATES_25_PERCENT = 6, + SAY_DALLIAH_CONVO_1 = 8, + SAY_DALLIAH_CONVO_2 = 9, + SAY_DALLIAH_CONVO_3 = 10 +}; + +enum Spells +{ + SPELL_FEL_IMMOLATION = 36051, + SPELL_FELFIRE_SHOCK = 35759, + SPELL_KNOCK_AWAY = 36512, + SPELL_FELFIRE_LINE_UP = 35770, + SPELL_CHARGE_TARGETING = 36038, + SPELL_CHARGE = 35754 +}; + +enum Events +{ + EVENT_FELFIRE_SHOCK = 1, + EVENT_KNOCK_AWAY = 2, + + EVENT_PREFIGHT_1 = 3, + EVENT_PREFIGHT_2 = 4, + EVENT_PREFIGHT_3 = 5, + EVENT_PREFIGHT_4 = 6, + EVENT_PREFIGHT_5 = 7, + EVENT_PREFIGHT_6 = 8, + EVENT_PREFIGHT_7 = 9, + EVENT_PREFIGHT_8 = 10, + EVENT_PREFIGHT_9 = 11, + EVENT_ME_FIRST = 12, +}; + +class boss_wrath_scryer_soccothrates : public CreatureScript +{ + public: + boss_wrath_scryer_soccothrates() : CreatureScript("boss_wrath_scryer_soccothrates") { } + + struct boss_wrath_scryer_soccothratesAI : public BossAI + { + boss_wrath_scryer_soccothratesAI(Creature* creature) : BossAI(creature, DATA_SOCCOTHRATES) { } + + void Reset() OVERRIDE + { + _Reset(); + preFight = false; + dalliahTaunt = false; + DoCast(me, SPELL_FEL_IMMOLATION); + } + + void JustDied(Unit* /*killer*/) OVERRIDE + { + _JustDied(); + Talk(SAY_DEATH); + } + + void EnterCombat(Unit* /*who*/) OVERRIDE + { + _EnterCombat(); + events.ScheduleEvent(EVENT_FELFIRE_SHOCK, urand(12000, 14000)); + events.ScheduleEvent(EVENT_KNOCK_AWAY, urand(11000, 12000)); + events.ScheduleEvent(EVENT_ME_FIRST, 6000); + Talk(SAY_AGGRO); + preFight = false; + } + + void KilledUnit(Unit* /*victim*/) OVERRIDE + { + Talk(SAY_SLAY); + } + + void MoveInLineOfSight(Unit* who) OVERRIDE + { + if (instance) + { + if (instance->GetData(DATA_CONVERSATION) == NOT_STARTED && who->GetTypeId() == TYPEID_PLAYER && me->IsWithinDistInMap(who, 70.0f)) + { + Talk(SAY_SOCCOTHRATES_CONVO_1); + instance->SetData(DATA_CONVERSATION, DONE); + + if (Creature* dalliah = me->FindNearestCreature(NPC_DALLIAH, 50.0f, true)) + { + dalliahGUID = dalliah->GetGUID(); + preFight = true; + events.ScheduleEvent(EVENT_PREFIGHT_1, 2000); + } + } + } + } + + void UpdateAI(uint32 diff) OVERRIDE + { + if (!UpdateVictim()) + { + if (preFight) + { + events.Update(diff); + + while (uint32 eventId = events.ExecuteEvent()) + { + switch (eventId) + { + case EVENT_PREFIGHT_1: + if (Creature* dalliah = me->GetCreature(*me, dalliahGUID)) + dalliah->AI()->Talk(SAY_DALLIAH_CONVO_1); + events.ScheduleEvent(EVENT_PREFIGHT_2, 3000); + break; + case EVENT_PREFIGHT_2: + Talk(SAY_SOCCOTHRATES_CONVO_2); + events.ScheduleEvent(EVENT_PREFIGHT_3, 3000); + break; + case EVENT_PREFIGHT_3: + if (Creature* dalliah = me->GetCreature(*me, dalliahGUID)) + dalliah->AI()->Talk(SAY_DALLIAH_CONVO_2); + events.ScheduleEvent(EVENT_PREFIGHT_4, 6000); + break; + case EVENT_PREFIGHT_4: + Talk(SAY_SOCCOTHRATES_CONVO_3); + events.ScheduleEvent(EVENT_PREFIGHT_5, 2000); + break; + case EVENT_PREFIGHT_5: + if (Creature* dalliah = me->GetCreature(*me, dalliahGUID)) + dalliah->AI()->Talk(SAY_DALLIAH_CONVO_3); + events.ScheduleEvent(EVENT_PREFIGHT_6, 3000); + break; + case EVENT_PREFIGHT_6: + Talk(SAY_SOCCOTHRATES_CONVO_4); + events.ScheduleEvent(EVENT_PREFIGHT_7, 2000); + break; + case EVENT_PREFIGHT_7: + if (Creature* dalliah = me->GetCreature(*me, dalliahGUID)) + dalliah->GetMotionMaster()->MovePoint(0, 118.6048f, 96.84852f, 22.44115f); + events.ScheduleEvent(EVENT_PREFIGHT_8, 4000); + break; + case EVENT_PREFIGHT_8: + me->GetMotionMaster()->MovePoint(0, 122.1035f, 192.7203f, 22.44115f); + events.ScheduleEvent(EVENT_PREFIGHT_9, 4000); + break; + case EVENT_PREFIGHT_9: + if (Creature* dalliah = me->GetCreature(*me, dalliahGUID)) + { + dalliah->SetFacingToObject(me); + me->SetFacingToObject(dalliah); + dalliah->SetHomePosition(dalliah->GetPositionX(), dalliah->GetPositionY(), dalliah->GetPositionZ(), 1.51737f); + me->SetHomePosition(me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), 4.725722f); + preFight = false; + } + break; + default: + break; + } + } + } + + return; + } + + events.Update(diff); + + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + + while (uint32 eventId = events.ExecuteEvent()) + { + switch (eventId) + { + case EVENT_FELFIRE_SHOCK: + DoCastVictim(SPELL_FELFIRE_SHOCK, true); + events.ScheduleEvent(EVENT_FELFIRE_SHOCK, urand(12000, 14000)); + break; + case EVENT_KNOCK_AWAY: + DoCast(me, SPELL_KNOCK_AWAY); + Talk(SAY_KNOCK_AWAY); + events.ScheduleEvent(EVENT_KNOCK_AWAY, urand(11000, 12000)); + break; + case EVENT_ME_FIRST: + if (Creature* dalliah = me->GetCreature(*me, dalliahGUID)) + if (dalliah->IsAlive() && !dalliah->IsInCombat()) + dalliah->AI()->Talk(SAY_AGGRO_SOCCOTHRATES_FIRST); + break; + default: + break; + } + } + + if (HealthBelowPct(25) && !dalliahTaunt) + { + if (Creature* dalliah = me->GetCreature(*me, dalliahGUID)) + dalliah->AI()->Talk(SAY_SOCCOTHRATES_25_PERCENT); + dalliahTaunt = true; + } + + DoMeleeAttackIfReady(); + } + + private: + bool preFight; + bool dalliahTaunt; + uint64 dalliahGUID; + }; + + CreatureAI* GetAI(Creature* creature) const OVERRIDE + { + return new boss_wrath_scryer_soccothratesAI(creature); + } +}; + +void AddSC_boss_wrath_scryer_soccothrates() +{ + new boss_wrath_scryer_soccothrates(); +} diff --git a/src/server/scripts/Outland/TempestKeep/arcatraz/boss_zereketh_the_unbound.cpp b/src/server/scripts/Outland/TempestKeep/arcatraz/boss_zereketh_the_unbound.cpp new file mode 100644 index 00000000000..062c88bb666 --- /dev/null +++ b/src/server/scripts/Outland/TempestKeep/arcatraz/boss_zereketh_the_unbound.cpp @@ -0,0 +1,132 @@ +/* + * Copyright (C) 2008-2013 TrinityCore <http://www.trinitycore.org/> + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2 of the License, or (at your + * option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along + * with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +/* ScriptData +SDName: boss_zereketh_the_unbound +SD%Complete: 100% +SDComment: +SDCategory: Tempest Keep, The Arcatraz +EndScriptData */ + +#include "ScriptMgr.h" +#include "ScriptedCreature.h" +#include "arcatraz.h" + +enum Say +{ + SAY_AGGRO = 0, + SAY_SLAY = 1, + SAY_SHADOW_NOVA = 2, + SAY_DEATH = 3 +}; + +enum Spells +{ + SPELL_VOID_ZONE = 36119, + SPELL_SHADOW_NOVA = 36127, + SPELL_SEED_OF_CORRUPTION = 36123 +}; + +enum Events +{ + EVENT_VOID_ZONE = 1, + EVENT_SHADOW_NOVA = 2, + EVENT_SEED_OF_CORRUPTION = 3 +}; + +class boss_zereketh_the_unbound : public CreatureScript +{ + public: + boss_zereketh_the_unbound() : CreatureScript("boss_zereketh_the_unbound") { } + + struct boss_zereketh_the_unboundAI : public BossAI + { + boss_zereketh_the_unboundAI(Creature* creature) : BossAI(creature, DATA_ZEREKETH) { } + + void Reset() OVERRIDE + { + _Reset(); + } + + void JustDied(Unit* /*killer*/) OVERRIDE + { + _JustDied(); + Talk(SAY_DEATH); + } + + void EnterCombat(Unit* /*who*/) OVERRIDE + { + _EnterCombat(); + events.ScheduleEvent(EVENT_VOID_ZONE, urand (6000, 10000)); + events.ScheduleEvent(EVENT_SHADOW_NOVA, urand (6000, 10000)); + events.ScheduleEvent(EVENT_SEED_OF_CORRUPTION, urand(12000, 20000)); + Talk(SAY_AGGRO); + } + + void KilledUnit(Unit* /*victim*/) OVERRIDE + { + Talk(SAY_SLAY); + } + + 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_VOID_ZONE: + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1, 100, true)) + DoCast(target, SPELL_VOID_ZONE); + events.ScheduleEvent(EVENT_VOID_ZONE, urand (6000, 10000)); + break; + case EVENT_SHADOW_NOVA: + DoCastVictim(SPELL_SHADOW_NOVA, true); + Talk(SAY_SHADOW_NOVA); + events.ScheduleEvent(EVENT_SHADOW_NOVA, urand (6000, 10000)); + break; + case EVENT_SEED_OF_CORRUPTION: + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1, 100, true)) + DoCast(target, SPELL_SEED_OF_CORRUPTION); + events.ScheduleEvent(EVENT_SEED_OF_CORRUPTION, urand(12000, 20000)); + break; + default: + break; + } + } + + DoMeleeAttackIfReady(); + } + }; + + CreatureAI* GetAI(Creature* creature) const OVERRIDE + { + return new boss_zereketh_the_unboundAI(creature); + } +}; + +void AddSC_boss_zereketh_the_unbound() +{ + new boss_zereketh_the_unbound(); +} diff --git a/src/server/scripts/Outland/TempestKeep/arcatraz/instance_arcatraz.cpp b/src/server/scripts/Outland/TempestKeep/arcatraz/instance_arcatraz.cpp index e836c5c4bf9..43f4a98c8cf 100644 --- a/src/server/scripts/Outland/TempestKeep/arcatraz/instance_arcatraz.cpp +++ b/src/server/scripts/Outland/TempestKeep/arcatraz/instance_arcatraz.cpp @@ -27,23 +27,6 @@ EndScriptData */ #include "InstanceScript.h" #include "arcatraz.h" -#define MAX_ENCOUNTER 9 - -enum Units -{ - CONTAINMENT_CORE_SECURITY_FIELD_ALPHA = 184318, //door opened when Wrath-Scryer Soccothrates dies - CONTAINMENT_CORE_SECURITY_FIELD_BETA = 184319, //door opened when Dalliah the Doomsayer dies - POD_ALPHA = 183961, //pod first boss wave - POD_BETA = 183963, //pod second boss wave - POD_DELTA = 183964, //pod third boss wave - POD_GAMMA = 183962, //pod fourth boss wave - POD_OMEGA = 183965, //pod fifth boss wave - WARDENS_SHIELD = 184802, // warden shield - SEAL_SPHERE = 184802, //shield 'protecting' mellichar - - MELLICHAR = 20904, //skyriss will kill this unit -}; - /* Arcatraz encounters: 1 - Zereketh the Unbound event 2 - Dalliah the Doomsayer event @@ -55,14 +38,14 @@ class instance_arcatraz : public InstanceMapScript { public: instance_arcatraz() - : InstanceMapScript("instance_arcatraz", 552) + : InstanceMapScript(AScriptName, 552) { } struct instance_arcatraz_InstanceMapScript : public InstanceScript { instance_arcatraz_InstanceMapScript(Map* map) : InstanceScript(map) { } - uint32 m_auiEncounter[MAX_ENCOUNTER]; + uint32 m_auiEncounter[EncounterCount]; uint64 Containment_Core_Security_Field_AlphaGUID; uint64 Containment_Core_Security_Field_BetaGUID; @@ -93,7 +76,7 @@ class instance_arcatraz : public InstanceMapScript bool IsEncounterInProgress() const OVERRIDE { - for (uint8 i = 0; i < MAX_ENCOUNTER; ++i) + for (uint8 i = 0; i < EncounterCount; ++i) if (m_auiEncounter[i] == IN_PROGRESS) return true; @@ -144,7 +127,7 @@ class instance_arcatraz : public InstanceMapScript void OnCreatureCreate(Creature* creature) OVERRIDE { - if (creature->GetEntry() == MELLICHAR) + if (creature->GetEntry() == NPC_MELLICHAR) MellicharGUID = creature->GetGUID(); } @@ -152,10 +135,10 @@ class instance_arcatraz : public InstanceMapScript { switch (type) { - case TYPE_ZEREKETH: + case DATA_ZEREKETH: m_auiEncounter[0] = data; break; - case TYPE_DALLIAH: + case DATA_DALLIAH: if (data == DONE) { if (GameObject* go = instance->GetGameObject(Containment_Core_Security_Field_BetaGUID)) @@ -163,7 +146,7 @@ class instance_arcatraz : public InstanceMapScript } m_auiEncounter[1] = data; break; - case TYPE_SOCCOTHRATES: + case DATA_SOCCOTHRATES: if (data == DONE) { if (GameObject* go = instance->GetGameObject(Containment_Core_Security_Field_AlphaGUID)) @@ -171,7 +154,7 @@ class instance_arcatraz : public InstanceMapScript } m_auiEncounter[2] = data; break; - case TYPE_HARBINGERSKYRISS: + case DATA_HARBINGERSKYRISS: if (data == NOT_STARTED || data == FAIL) { m_auiEncounter[4] = NOT_STARTED; @@ -182,13 +165,13 @@ class instance_arcatraz : public InstanceMapScript } m_auiEncounter[3] = data; break; - case TYPE_WARDEN_1: + case DATA_WARDEN_1: if (data == IN_PROGRESS) if (GameObject* go = instance->GetGameObject(Pod_AlphaGUID)) go->UseDoorOrButton(); m_auiEncounter[4] = data; break; - case TYPE_WARDEN_2: + case DATA_WARDEN_2: if (data == IN_PROGRESS) { if (GameObject* go = instance->GetGameObject(Pod_BetaGUID)) @@ -196,7 +179,7 @@ class instance_arcatraz : public InstanceMapScript } m_auiEncounter[5] = data; break; - case TYPE_WARDEN_3: + case DATA_WARDEN_3: if (data == IN_PROGRESS) { if (GameObject* go = instance->GetGameObject(Pod_DeltaGUID)) @@ -204,7 +187,7 @@ class instance_arcatraz : public InstanceMapScript } m_auiEncounter[6] = data; break; - case TYPE_WARDEN_4: + case DATA_WARDEN_4: if (data == IN_PROGRESS) { if (GameObject* go = instance->GetGameObject(Pod_GammaGUID)) @@ -212,7 +195,7 @@ class instance_arcatraz : public InstanceMapScript } m_auiEncounter[7] = data; break; - case TYPE_WARDEN_5: + case DATA_WARDEN_5: if (data == IN_PROGRESS) { if (GameObject* go = instance->GetGameObject(Pod_OmegaGUID)) @@ -220,13 +203,16 @@ class instance_arcatraz : public InstanceMapScript } m_auiEncounter[8] = data; break; - case TYPE_SHIELD_OPEN: + case DATA_SHIELD_OPEN: if (data == IN_PROGRESS) { if (GameObject* go = instance->GetGameObject(Wardens_ShieldGUID)) go->UseDoorOrButton(); } break; + case DATA_CONVERSATION: + m_auiEncounter[12] = data; + break; } } @@ -234,12 +220,13 @@ class instance_arcatraz : public InstanceMapScript { switch (type) { - case TYPE_HARBINGERSKYRISS: return m_auiEncounter[3]; - case TYPE_WARDEN_1: return m_auiEncounter[4]; - case TYPE_WARDEN_2: return m_auiEncounter[5]; - case TYPE_WARDEN_3: return m_auiEncounter[6]; - case TYPE_WARDEN_4: return m_auiEncounter[7]; - case TYPE_WARDEN_5: return m_auiEncounter[8]; + case DATA_HARBINGERSKYRISS: return m_auiEncounter[3]; + case DATA_WARDEN_1: return m_auiEncounter[4]; + case DATA_WARDEN_2: return m_auiEncounter[5]; + case DATA_WARDEN_3: return m_auiEncounter[6]; + case DATA_WARDEN_4: return m_auiEncounter[7]; + case DATA_WARDEN_5: return m_auiEncounter[8]; + case DATA_CONVERSATION: return m_auiEncounter[12]; } return 0; } |