aboutsummaryrefslogtreecommitdiff
path: root/src/server/scripts
diff options
context:
space:
mode:
Diffstat (limited to 'src/server/scripts')
-rw-r--r--src/server/scripts/CMakeLists.txt1
-rw-r--r--src/server/scripts/Commands/cs_reload.cpp29
-rw-r--r--src/server/scripts/EasternKingdoms/AlteracValley/boss_balinda.cpp1
-rw-r--r--src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_rend_blackhand.cpp1
-rw-r--r--src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/instance_blackrock_spire.cpp39
-rw-r--r--src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_nefarian.cpp1
-rw-r--r--src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/instance_blackwing_lair.cpp1
-rw-r--r--src/server/scripts/EasternKingdoms/Karazhan/karazhan.cpp3
-rw-r--r--src/server/scripts/EasternKingdoms/ScarletMonastery/boss_headless_horseman.cpp1
-rw-r--r--src/server/scripts/EasternKingdoms/SunwellPlateau/boss_eredar_twins.cpp32
-rw-r--r--src/server/scripts/EasternKingdoms/zone_hinterlands.cpp6
-rw-r--r--src/server/scripts/Kalimdor/CMakeLists.txt5
-rw-r--r--src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_anetheron.cpp1
-rw-r--r--src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_azgalor.cpp1
-rw-r--r--src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjal_trash.cpp2
-rw-r--r--src/server/scripts/Kalimdor/RazorfenDowns/boss_amnennar_the_coldbringer.cpp115
-rw-r--r--src/server/scripts/Kalimdor/RazorfenDowns/boss_glutton.cpp103
-rw-r--r--src/server/scripts/Kalimdor/RazorfenDowns/boss_mordresh_fire_eye.cpp136
-rw-r--r--src/server/scripts/Kalimdor/RazorfenDowns/boss_tuten_kash.cpp107
-rw-r--r--src/server/scripts/Kalimdor/RazorfenDowns/instance_razorfen_downs.cpp270
-rw-r--r--src/server/scripts/Kalimdor/RazorfenDowns/razorfen_downs.cpp344
-rw-r--r--src/server/scripts/Kalimdor/RazorfenDowns/razorfen_downs.h51
-rw-r--r--src/server/scripts/Kalimdor/RazorfenKraul/razorfen_kraul.cpp1
-rw-r--r--src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_cthun.cpp4
-rw-r--r--src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_northrend_beasts.cpp3
-rw-r--r--src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/halls_of_reflection.cpp44
-rw-r--r--src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/instance_halls_of_reflection.cpp17
-rw-r--r--src/server/scripts/Northrend/FrozenHalls/PitOfSaron/boss_forgemaster_garfrost.cpp4
-rw-r--r--src/server/scripts/Northrend/FrozenHalls/PitOfSaron/instance_pit_of_saron.cpp2
-rw-r--r--src/server/scripts/Northrend/Naxxramas/boss_gothik.cpp1
-rw-r--r--src/server/scripts/Northrend/Nexus/EyeOfEternity/instance_eye_of_eternity.cpp2
-rw-r--r--src/server/scripts/Northrend/Nexus/Oculus/instance_oculus.cpp2
-rw-r--r--src/server/scripts/Northrend/Nexus/Oculus/oculus.cpp203
-rw-r--r--src/server/scripts/Northrend/zone_grizzly_hills.cpp40
-rw-r--r--src/server/scripts/Northrend/zone_howling_fjord.cpp112
-rw-r--r--src/server/scripts/Northrend/zone_icecrown.cpp86
-rw-r--r--src/server/scripts/Northrend/zone_sholazar_basin.cpp52
-rw-r--r--src/server/scripts/Northrend/zone_storm_peaks.cpp193
-rw-r--r--src/server/scripts/Northrend/zone_zuldrak.cpp14
-rw-r--r--src/server/scripts/Outland/Auchindoun/AuchenaiCrypts/boss_exarch_maladaar.cpp1
-rw-r--r--src/server/scripts/Outland/TempestKeep/arcatraz/boss_dalliah_the_doomsayer.cpp18
-rw-r--r--src/server/scripts/Outland/TempestKeep/arcatraz/boss_wrath_scryer_soccothrates.cpp44
-rw-r--r--src/server/scripts/Outland/TempestKeep/arcatraz/instance_arcatraz.cpp44
-rw-r--r--src/server/scripts/Outland/zone_blades_edge_mountains.cpp101
44 files changed, 1700 insertions, 538 deletions
diff --git a/src/server/scripts/CMakeLists.txt b/src/server/scripts/CMakeLists.txt
index 5be634d2060..20e4c4c7fdd 100644
--- a/src/server/scripts/CMakeLists.txt
+++ b/src/server/scripts/CMakeLists.txt
@@ -73,7 +73,6 @@ include_directories(
${CMAKE_SOURCE_DIR}/src/server/game/Addons
${CMAKE_SOURCE_DIR}/src/server/game/AI
${CMAKE_SOURCE_DIR}/src/server/game/AI/CoreAI
- ${CMAKE_SOURCE_DIR}/src/server/game/AI/EventAI
${CMAKE_SOURCE_DIR}/src/server/game/AI/ScriptedAI
${CMAKE_SOURCE_DIR}/src/server/game/AI/SmartScripts
${CMAKE_SOURCE_DIR}/src/server/game/AuctionHouse
diff --git a/src/server/scripts/Commands/cs_reload.cpp b/src/server/scripts/Commands/cs_reload.cpp
index 039766177c1..59477c6684f 100644
--- a/src/server/scripts/Commands/cs_reload.cpp
+++ b/src/server/scripts/Commands/cs_reload.cpp
@@ -26,7 +26,6 @@ EndScriptData */
#include "AchievementMgr.h"
#include "AuctionHouseMgr.h"
#include "Chat.h"
-#include "CreatureEventAIMgr.h"
#include "CreatureTextMgr.h"
#include "DisableMgr.h"
#include "Language.h"
@@ -53,7 +52,6 @@ public:
{
{ "achievement", rbac::RBAC_PERM_COMMAND_RELOAD_ALL_ACHIEVEMENT, true, &HandleReloadAllAchievementCommand, "", NULL },
{ "area", rbac::RBAC_PERM_COMMAND_RELOAD_ALL_AREA, true, &HandleReloadAllAreaCommand, "", NULL },
- { "eventai", rbac::RBAC_PERM_COMMAND_RELOAD_ALL_EVENTAI, true, &HandleReloadAllEventAICommand, "", NULL },
{ "gossips", rbac::RBAC_PERM_COMMAND_RELOAD_ALL_GOSSIP, true, &HandleReloadAllGossipsCommand, "", NULL },
{ "item", rbac::RBAC_PERM_COMMAND_RELOAD_ALL_ITEM, true, &HandleReloadAllItemCommand, "", NULL },
{ "locales", rbac::RBAC_PERM_COMMAND_RELOAD_ALL_LOCALES, true, &HandleReloadAllLocalesCommand, "", NULL },
@@ -80,8 +78,6 @@ public:
{ "conditions", rbac::RBAC_PERM_COMMAND_RELOAD_CONDITIONS, true, &HandleReloadConditions, "", NULL },
{ "config", rbac::RBAC_PERM_COMMAND_RELOAD_CONFIG, true, &HandleReloadConfigCommand, "", NULL },
{ "creature_text", rbac::RBAC_PERM_COMMAND_RELOAD_CREATURE_TEXT, true, &HandleReloadCreatureText, "", NULL },
- { "creature_ai_scripts", rbac::RBAC_PERM_COMMAND_RELOAD_CREATURE_AI_SCRIPTS, true, &HandleReloadEventAIScriptsCommand, "", NULL },
- { "creature_ai_texts", rbac::RBAC_PERM_COMMAND_RELOAD_CREATURE_AI_TEXTS, true, &HandleReloadEventAITextsCommand, "", NULL },
{ "creature_questender", rbac::RBAC_PERM_COMMAND_RELOAD_CREATURE_QUESTENDER, true, &HandleReloadCreatureQuestEnderCommand, "", NULL },
{ "creature_linked_respawn", rbac::RBAC_PERM_COMMAND_RELOAD_CREATURE_LINKED_RESPAWN, true, &HandleReloadLinkedRespawnCommand, "", NULL },
{ "creature_loot_template", rbac::RBAC_PERM_COMMAND_RELOAD_CREATURE_LOOT_TEMPLATE, true, &HandleReloadLootTemplatesCreatureCommand, "", NULL },
@@ -182,7 +178,6 @@ public:
HandleReloadAllAchievementCommand(handler, "");
HandleReloadAllAreaCommand(handler, "");
- HandleReloadAllEventAICommand(handler, "");
HandleReloadAllLootCommand(handler, "");
HandleReloadAllNpcCommand(handler, "");
HandleReloadAllQuestCommand(handler, "");
@@ -273,13 +268,6 @@ public:
return true;
}
- static bool HandleReloadAllEventAICommand(ChatHandler* handler, const char* /*args*/)
- {
- HandleReloadEventAITextsCommand(handler, "a");
- HandleReloadEventAIScriptsCommand(handler, "a");
- return true;
- }
-
static bool HandleReloadAllSpellCommand(ChatHandler* handler, const char* /*args*/)
{
HandleReloadSkillDiscoveryTemplateCommand(handler, "a");
@@ -1014,23 +1002,6 @@ public:
return true;
}
- static bool HandleReloadEventAITextsCommand(ChatHandler* handler, const char* /*args*/)
- {
-
- TC_LOG_INFO("misc", "Re-Loading Texts from `creature_ai_texts`...");
- sEventAIMgr->LoadCreatureEventAI_Texts();
- handler->SendGlobalGMSysMessage("DB table `creature_ai_texts` reloaded.");
- return true;
- }
-
- static bool HandleReloadEventAIScriptsCommand(ChatHandler* handler, const char* /*args*/)
- {
- TC_LOG_INFO("misc", "Re-Loading Scripts from `creature_ai_scripts`...");
- sEventAIMgr->LoadCreatureEventAI_Scripts();
- handler->SendGlobalGMSysMessage("DB table `creature_ai_scripts` reloaded.");
- return true;
- }
-
static bool HandleReloadSpellScriptsCommand(ChatHandler* handler, const char* args)
{
if (sScriptMgr->IsScriptScheduled())
diff --git a/src/server/scripts/EasternKingdoms/AlteracValley/boss_balinda.cpp b/src/server/scripts/EasternKingdoms/AlteracValley/boss_balinda.cpp
index 6dbcdffca72..2b1b04cb654 100644
--- a/src/server/scripts/EasternKingdoms/AlteracValley/boss_balinda.cpp
+++ b/src/server/scripts/EasternKingdoms/AlteracValley/boss_balinda.cpp
@@ -60,6 +60,7 @@ public:
{
waterBoltTimer = 3 * IN_MILLISECONDS;
resetTimer = 5 * IN_MILLISECONDS;
+ balindaGUID = 0;
}
void UpdateAI(uint32 diff) OVERRIDE
diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_rend_blackhand.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_rend_blackhand.cpp
index 275b3802764..ff839e3cacb 100644
--- a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_rend_blackhand.cpp
+++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_rend_blackhand.cpp
@@ -171,6 +171,7 @@ public:
_Reset();
gythEvent = false;
victorGUID = 0;
+ portcullisGUID = 0;
}
void EnterCombat(Unit* /*who*/) OVERRIDE
diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/instance_blackrock_spire.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/instance_blackrock_spire.cpp
index 9b250cc169a..a1bbad7ee1c 100644
--- a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/instance_blackrock_spire.cpp
+++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/instance_blackrock_spire.cpp
@@ -73,6 +73,8 @@ public:
go_blackrockaltar = 0;
go_portcullis_active = 0;
go_portcullis_tobossrooms = 0;
+ memset(go_roomrunes, 0, sizeof(go_roomrunes));
+ memset(go_emberseerrunes, 0, sizeof(go_emberseerrunes));
}
void OnCreatureCreate(Creature* creature) OVERRIDE
@@ -270,7 +272,7 @@ public:
return true;
}
- void ProcessEvent(WorldObject* /*gameObject*/, uint32 eventId) OVERRIDE
+ void ProcessEvent(WorldObject* /*obj*/, uint32 eventId) OVERRIDE
{
switch (eventId)
{
@@ -313,102 +315,71 @@ public:
{
case DATA_HIGHLORD_OMOKK:
return HighlordOmokk;
- break;
case DATA_SHADOW_HUNTER_VOSHGAJIN:
return ShadowHunterVoshgajin;
- break;
case DATA_WARMASTER_VOONE:
return WarMasterVoone;
- break;
case DATA_MOTHER_SMOLDERWEB:
return MotherSmolderweb;
- break;
case DATA_UROK_DOOMHOWL:
return UrokDoomhowl;
- break;
case DATA_QUARTERMASTER_ZIGRIS:
return QuartermasterZigris;
- break;
case DATA_GIZRUL_THE_SLAVENER:
return GizrultheSlavener;
- break;
case DATA_HALYCON:
return Halycon;
- break;
case DATA_OVERLORD_WYRMTHALAK:
return OverlordWyrmthalak;
- break;
case DATA_PYROGAURD_EMBERSEER:
return PyroguardEmberseer;
- break;
case DATA_WARCHIEF_REND_BLACKHAND:
return WarchiefRendBlackhand;
- break;
case DATA_GYTH:
return Gyth;
- break;
case DATA_THE_BEAST:
return TheBeast;
- break;
case DATA_GENERAL_DRAKKISATH:
return GeneralDrakkisath;
- break;
case GO_EMBERSEER_IN:
return go_emberseerin;
- break;
case GO_DOORS:
return go_doors;
- break;
case GO_EMBERSEER_OUT:
return go_emberseerout;
- break;
case GO_HALL_RUNE_1:
return go_roomrunes[0];
- break;
case GO_HALL_RUNE_2:
return go_roomrunes[1];
- break;
case GO_HALL_RUNE_3:
return go_roomrunes[2];
- break;
case GO_HALL_RUNE_4:
return go_roomrunes[3];
- break;
case GO_HALL_RUNE_5:
return go_roomrunes[4];
- break;
case GO_HALL_RUNE_6:
return go_roomrunes[5];
- break;
case GO_HALL_RUNE_7:
return go_roomrunes[6];
- break;
case GO_EMBERSEER_RUNE_1:
return go_emberseerrunes[0];
- break;
case GO_EMBERSEER_RUNE_2:
return go_emberseerrunes[1];
- break;
case GO_EMBERSEER_RUNE_3:
return go_emberseerrunes[2];
- break;
case GO_EMBERSEER_RUNE_4:
return go_emberseerrunes[3];
- break;
case GO_EMBERSEER_RUNE_5:
return go_emberseerrunes[4];
- break;
case GO_EMBERSEER_RUNE_6:
return go_emberseerrunes[5];
- break;
case GO_EMBERSEER_RUNE_7:
return go_emberseerrunes[6];
- break;
case GO_PORTCULLIS_ACTIVE:
return go_portcullis_active;
- break;
case GO_PORTCULLIS_TOBOSSROOMS:
return go_portcullis_tobossrooms;
+ default:
break;
}
return 0;
@@ -577,8 +548,6 @@ public:
protected:
EventMap Events;
- uint32 encounter[EncounterCount];
- std::string m_strInstData;
uint64 HighlordOmokk;
uint64 ShadowHunterVoshgajin;
uint64 WarMasterVoone;
diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_nefarian.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_nefarian.cpp
index f3a788918f2..4e0c79509fc 100644
--- a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_nefarian.cpp
+++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_nefarian.cpp
@@ -264,7 +264,6 @@ public:
if (Unit* player = me->SelectNearestPlayer(60.0f))
{
me->SetInFront(player);
- me->SendMovementFlagUpdate();
Talk(SAY_SUCCESS);
if (GameObject* portcullis1 = me->FindNearestGameObject(GO_PORTCULLIS_ACTIVE, 65.0f))
portcullis1->SetGoState(GO_STATE_ACTIVE);
diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/instance_blackwing_lair.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/instance_blackwing_lair.cpp
index 622c34d3358..0c85e89ec4a 100644
--- a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/instance_blackwing_lair.cpp
+++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/instance_blackwing_lair.cpp
@@ -63,6 +63,7 @@ public:
{
// Razorgore
EggCount = 0;
+ EggEvent = 0;
RazorgoreTheUntamedGUID = 0;
RazorgoreDoorGUID = 0;
EggList.clear();
diff --git a/src/server/scripts/EasternKingdoms/Karazhan/karazhan.cpp b/src/server/scripts/EasternKingdoms/Karazhan/karazhan.cpp
index 8efcbf29d30..91127f2db0d 100644
--- a/src/server/scripts/EasternKingdoms/Karazhan/karazhan.cpp
+++ b/src/server/scripts/EasternKingdoms/Karazhan/karazhan.cpp
@@ -614,7 +614,8 @@ public:
}
return 50000;
case 15:
- arca->DealDamage(arca, arca->GetHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false);
+ if (arca)
+ arca->DealDamage(arca, arca->GetHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false);
return 5000;
default : return 9999999;
}
diff --git a/src/server/scripts/EasternKingdoms/ScarletMonastery/boss_headless_horseman.cpp b/src/server/scripts/EasternKingdoms/ScarletMonastery/boss_headless_horseman.cpp
index 463e88b670b..0810d5ca2b8 100644
--- a/src/server/scripts/EasternKingdoms/ScarletMonastery/boss_headless_horseman.cpp
+++ b/src/server/scripts/EasternKingdoms/ScarletMonastery/boss_headless_horseman.cpp
@@ -807,6 +807,7 @@ public:
me->GetPosition(x, y, z); //this visual aura some under ground
me->SetPosition(x, y, z + 0.35f, 0.0f);
Despawn();
+ debuffGUID = 0;
Creature* debuff = DoSpawnCreature(HELPER, 0, 0, 0, 0, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 14500);
if (debuff)
{
diff --git a/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_eredar_twins.cpp b/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_eredar_twins.cpp
index 280b4c27770..e68d834b20d 100644
--- a/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_eredar_twins.cpp
+++ b/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_eredar_twins.cpp
@@ -200,16 +200,13 @@ public:
{
if (!SisterDeath)
{
- if (instance)
+ Unit* Temp = ObjectAccessor::GetUnit(*me, instance->GetData64(DATA_ALYTHESS));
+ if (Temp && Temp->isDead())
{
- Unit* Temp = Unit::GetUnit(*me, instance->GetData64(DATA_ALYTHESS));
- if (Temp && Temp->isDead())
- {
- Talk(YELL_SISTER_ALYTHESS_DEAD);
- DoCast(me, SPELL_EMPOWER);
- me->InterruptSpell(CURRENT_GENERIC_SPELL);
- SisterDeath = true;
- }
+ Talk(YELL_SISTER_ALYTHESS_DEAD);
+ DoCast(me, SPELL_EMPOWER);
+ me->InterruptSpell(CURRENT_GENERIC_SPELL);
+ SisterDeath = true;
}
}
@@ -347,15 +344,12 @@ public:
{
Enraged = false;
- if (instance)
+ if (Creature* temp = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_SACROLASH)))
{
- if (Creature* temp = ObjectAccessor::GetCreature((*me), instance->GetData64(DATA_SACROLASH)))
- {
- if (temp->isDead())
- temp->Respawn();
- else if (temp->GetVictim())
- me->getThreatManager().addThreat(temp->GetVictim(), 0.0f);
- }
+ if (temp->isDead())
+ temp->Respawn();
+ else if (temp->GetVictim())
+ me->getThreatManager().addThreat(temp->GetVictim(), 0.0f);
}
if (!me->IsInCombat())
@@ -527,7 +521,7 @@ public:
if (!SisterDeath)
{
- Unit* Temp = Unit::GetUnit(*me, instance->GetData64(DATA_SACROLASH));
+ Unit* Temp = ObjectAccessor::GetUnit(*me, instance->GetData64(DATA_SACROLASH));
if (Temp && Temp->isDead())
{
Talk(YELL_SISTER_SACROLASH_DEAD);
@@ -538,7 +532,7 @@ public:
}
if (!me->GetVictim())
{
- Creature* sisiter = ObjectAccessor::GetCreature((*me), instance->GetData64(DATA_SACROLASH));
+ Creature* sisiter = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_SACROLASH));
if (sisiter && !sisiter->isDead() && sisiter->GetVictim())
{
me->AddThreat(sisiter->GetVictim(), 0.0f);
diff --git a/src/server/scripts/EasternKingdoms/zone_hinterlands.cpp b/src/server/scripts/EasternKingdoms/zone_hinterlands.cpp
index ebec0170d23..257e3c21688 100644
--- a/src/server/scripts/EasternKingdoms/zone_hinterlands.cpp
+++ b/src/server/scripts/EasternKingdoms/zone_hinterlands.cpp
@@ -41,9 +41,9 @@ enum OOX
{
SAY_OOX_START = 0,
SAY_OOX_AGGRO = 1,
- SAY_OOX_AMBUSH = 3,
- SAY_OOX_AMBUSH_REPLY = 4,
- SAY_OOX_END = 5,
+ SAY_OOX_AMBUSH = 2,
+ SAY_OOX_AMBUSH_REPLY = 3,
+ SAY_OOX_END = 4,
QUEST_RESQUE_OOX_09 = 836,
diff --git a/src/server/scripts/Kalimdor/CMakeLists.txt b/src/server/scripts/Kalimdor/CMakeLists.txt
index 17c360a54b2..c02e896a87d 100644
--- a/src/server/scripts/Kalimdor/CMakeLists.txt
+++ b/src/server/scripts/Kalimdor/CMakeLists.txt
@@ -15,12 +15,15 @@ set(scripts_STAT_SRCS
Kalimdor/zone_moonglade.cpp
Kalimdor/RazorfenDowns/razorfen_downs.cpp
Kalimdor/RazorfenDowns/instance_razorfen_downs.cpp
+ Kalimdor/RazorfenDowns/boss_tuten_kash.cpp
+ Kalimdor/RazorfenDowns/boss_mordresh_fire_eye.cpp
+ Kalimdor/RazorfenDowns/boss_glutton.cpp
Kalimdor/RazorfenDowns/boss_amnennar_the_coldbringer.cpp
Kalimdor/RazorfenDowns/razorfen_downs.h
- Kalimdor/ZulFarrak/zulfarrak.h
Kalimdor/ZulFarrak/zulfarrak.cpp
Kalimdor/ZulFarrak/instance_zulfarrak.cpp
Kalimdor/ZulFarrak/boss_zum_rah.cpp
+ Kalimdor/ZulFarrak/zulfarrak.h
Kalimdor/CavernsOfTime/EscapeFromDurnholdeKeep/boss_epoch_hunter.cpp
Kalimdor/CavernsOfTime/EscapeFromDurnholdeKeep/old_hillsbrad.h
Kalimdor/CavernsOfTime/EscapeFromDurnholdeKeep/boss_leutenant_drake.cpp
diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_anetheron.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_anetheron.cpp
index 164de89b017..52f706d5626 100644
--- a/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_anetheron.cpp
+++ b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_anetheron.cpp
@@ -186,6 +186,7 @@ public:
{
npc_towering_infernalAI(Creature* creature) : ScriptedAI(creature)
{
+ AnetheronGUID = 0;
instance = creature->GetInstanceScript();
if (instance)
AnetheronGUID = instance->GetData64(DATA_ANETHERON);
diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_azgalor.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_azgalor.cpp
index aaf2bb65ba0..dd486df16ed 100644
--- a/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_azgalor.cpp
+++ b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_azgalor.cpp
@@ -193,6 +193,7 @@ public:
{
npc_lesser_doomguardAI(Creature* creature) : hyjal_trashAI(creature)
{
+ AzgalorGUID = 0;
instance = creature->GetInstanceScript();
if (instance)
AzgalorGUID = instance->GetData64(DATA_AZGALOR);
diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjal_trash.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjal_trash.cpp
index 43d75fad876..9245a0c648f 100644
--- a/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjal_trash.cpp
+++ b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjal_trash.cpp
@@ -186,6 +186,7 @@ hyjal_trashAI::hyjal_trashAI(Creature* creature) : npc_escortAI(creature)
faction = 0;
useFlyPath = false;
damageTaken = 0;
+ memset(DummyTarget, 0, sizeof(DummyTarget));
Reset();
}
@@ -430,7 +431,6 @@ public:
bool meteor;
bool CanMove;
- bool WpEnabled;
bool go;
uint32 spawnTimer;
uint32 FlameBuffetTimer;
diff --git a/src/server/scripts/Kalimdor/RazorfenDowns/boss_amnennar_the_coldbringer.cpp b/src/server/scripts/Kalimdor/RazorfenDowns/boss_amnennar_the_coldbringer.cpp
index 4a4d7fe4b07..323fd92a8f6 100644
--- a/src/server/scripts/Kalimdor/RazorfenDowns/boss_amnennar_the_coldbringer.cpp
+++ b/src/server/scripts/Kalimdor/RazorfenDowns/boss_amnennar_the_coldbringer.cpp
@@ -1,6 +1,5 @@
/*
* Copyright (C) 2008-2013 TrinityCore <http://www.trinitycore.org/>
- * Copyright (C) 2006-2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
*
* 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
@@ -16,63 +15,57 @@
* with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-/* ScriptData
-SDName: Boss_Amnennar_the_coldbringer
-SD%Complete: 100
-SDComment:
-SDCategory: Razorfen Downs
-EndScriptData */
-
#include "ScriptMgr.h"
#include "ScriptedCreature.h"
+#include "razorfen_downs.h"
-enum AmnennarTheColdbringer
+enum Say
{
SAY_AGGRO = 0,
SAY_SUMMON60 = 1,
SAY_SUMMON30 = 2,
SAY_HP = 3,
- SAY_KILL = 4,
+ SAY_KILL = 4
+};
+enum Spells
+{
SPELL_AMNENNARSWRATH = 13009,
SPELL_FROSTBOLT = 15530,
SPELL_FROST_NOVA = 15531,
SPELL_FROST_SPECTRES = 12642
};
+enum Events
+{
+ EVENT_AMNENNARSWRATH = 1,
+ EVENT_FROSTBOLT = 2,
+ EVENT_FROST_NOVA = 3
+};
+
class boss_amnennar_the_coldbringer : public CreatureScript
{
public:
boss_amnennar_the_coldbringer() : CreatureScript("boss_amnennar_the_coldbringer") { }
- CreatureAI* GetAI(Creature* creature) const OVERRIDE
- {
- return new boss_amnennar_the_coldbringerAI(creature);
- }
-
- struct boss_amnennar_the_coldbringerAI : public ScriptedAI
+ struct boss_amnennar_the_coldbringerAI : public BossAI
{
- boss_amnennar_the_coldbringerAI(Creature* creature) : ScriptedAI(creature) { }
-
- uint32 AmnenarsWrath_Timer;
- uint32 FrostBolt_Timer;
- uint32 FrostNova_Timer;
- bool Spectrals60;
- bool Spectrals30;
- bool Hp;
+ boss_amnennar_the_coldbringerAI(Creature* creature) : BossAI(creature, DATA_AMNENNAR_THE_COLD_BRINGER) { }
void Reset() OVERRIDE
{
- AmnenarsWrath_Timer = 8000;
- FrostBolt_Timer = 1000;
- FrostNova_Timer = urand(10000, 15000);
- Spectrals30 = false;
- Spectrals60 = false;
- Hp = false;
+ _Reset();
+ hp60Spectrals = false;
+ hp30Spectrals = false;
+ hp50 = false;
}
void EnterCombat(Unit* /*who*/) OVERRIDE
{
+ _EnterCombat();
+ events.ScheduleEvent(EVENT_AMNENNARSWRATH, 8000);
+ events.ScheduleEvent(EVENT_FROSTBOLT, 1000);
+ events.ScheduleEvent(EVENT_FROST_NOVA, urand(10000, 15000));
Talk(SAY_AGGRO);
}
@@ -81,55 +74,73 @@ public:
Talk(SAY_KILL);
}
+ void JustDied(Unit* /*killer*/) OVERRIDE
+ {
+ _JustDied();
+ }
+
void UpdateAI(uint32 diff) OVERRIDE
{
if (!UpdateVictim())
return;
- //AmnenarsWrath_Timer
- if (AmnenarsWrath_Timer <= diff)
- {
- DoCastVictim(SPELL_AMNENNARSWRATH);
- AmnenarsWrath_Timer = 12000;
- } else AmnenarsWrath_Timer -= diff;
+ events.Update(diff);
- //FrostBolt_Timer
- if (FrostBolt_Timer <= diff)
- {
- DoCastVictim(SPELL_FROSTBOLT);
- FrostBolt_Timer = 8000;
- } else FrostBolt_Timer -= diff;
+ if (me->HasUnitState(UNIT_STATE_CASTING))
+ return;
- if (FrostNova_Timer <= diff)
+ while (uint32 eventId = events.ExecuteEvent())
{
- DoCast(me, SPELL_FROST_NOVA);
- FrostNova_Timer = 15000;
- } else FrostNova_Timer -= diff;
+ switch (eventId)
+ {
+ case EVENT_AMNENNARSWRATH:
+ DoCastVictim(SPELL_AMNENNARSWRATH);
+ events.ScheduleEvent(EVENT_AMNENNARSWRATH, 12000);
+ break;
+ case EVENT_FROSTBOLT:
+ DoCastVictim(SPELL_FROSTBOLT);
+ events.ScheduleEvent(EVENT_FROSTBOLT, 8000);
+ break;
+ case EVENT_FROST_NOVA:
+ DoCast(me, SPELL_FROST_NOVA);
+ events.ScheduleEvent(EVENT_FROST_NOVA, 15000);
+ break;
+ }
+ }
- if (!Spectrals60 && HealthBelowPct(60))
+ if (!hp60Spectrals && HealthBelowPct(60))
{
Talk(SAY_SUMMON60);
DoCastVictim(SPELL_FROST_SPECTRES);
- Spectrals60 = true;
+ hp60Spectrals = true;
}
- if (!Hp && HealthBelowPct(50))
+ if (!hp50 && HealthBelowPct(50))
{
Talk(SAY_HP);
- Hp = true;
+ hp50 = true;
}
- if (!Spectrals30 && HealthBelowPct(30))
+ if (!hp30Spectrals && HealthBelowPct(30))
{
Talk(SAY_SUMMON30);
DoCastVictim(SPELL_FROST_SPECTRES);
- Spectrals30 = true;
+ hp30Spectrals = true;
}
DoMeleeAttackIfReady();
}
+
+ private:
+ bool hp60Spectrals;
+ bool hp30Spectrals;
+ bool hp50;
};
+ CreatureAI* GetAI(Creature* creature) const OVERRIDE
+ {
+ return new boss_amnennar_the_coldbringerAI(creature);
+ }
};
void AddSC_boss_amnennar_the_coldbringer()
diff --git a/src/server/scripts/Kalimdor/RazorfenDowns/boss_glutton.cpp b/src/server/scripts/Kalimdor/RazorfenDowns/boss_glutton.cpp
new file mode 100644
index 00000000000..b75fcad64a5
--- /dev/null
+++ b/src/server/scripts/Kalimdor/RazorfenDowns/boss_glutton.cpp
@@ -0,0 +1,103 @@
+/*
+ * 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/>.
+ */
+
+#include "ScriptMgr.h"
+#include "ScriptedCreature.h"
+#include "razorfen_downs.h"
+
+enum Say
+{
+ SAY_AGGRO = 0,
+ SAY_SLAY = 1,
+ SAY_HP50 = 2,
+ SAY_HP15 = 3
+};
+
+enum Spells
+{
+ SPELL_DISEASE_CLOUD = 12627,
+ SPELL_FRENZY = 12795
+};
+
+class boss_glutton : public CreatureScript
+{
+public:
+ boss_glutton() : CreatureScript("boss_glutton") { }
+
+ struct boss_gluttonAI : public BossAI
+ {
+ boss_gluttonAI(Creature* creature) : BossAI(creature, DATA_GLUTTON) { }
+
+ void Reset() OVERRIDE
+ {
+ _Reset();
+ hp50 = false;
+ hp15 = false;
+ }
+
+ void EnterCombat(Unit* /*who*/) OVERRIDE
+ {
+ _EnterCombat();
+ Talk(SAY_AGGRO);
+ }
+
+ void KilledUnit(Unit* /*victim*/) OVERRIDE
+ {
+ Talk(SAY_SLAY);
+ }
+
+ void JustDied(Unit* /*killer*/) OVERRIDE
+ {
+ _JustDied();
+ }
+
+ void UpdateAI(uint32 /*diff*/) OVERRIDE
+ {
+ if (!UpdateVictim())
+ return;
+
+ if (!hp50 && HealthBelowPct(50))
+ {
+ Talk(SAY_HP50);
+ hp50 = true;
+ }
+
+ if (!hp15 && HealthBelowPct(15))
+ {
+ Talk(SAY_HP15);
+ DoCast(me, SPELL_FRENZY);
+ hp15 = true;
+ }
+
+ DoMeleeAttackIfReady();
+ }
+
+ private:
+ bool hp50;
+ bool hp15;
+ };
+
+ CreatureAI* GetAI(Creature* creature) const OVERRIDE
+ {
+ return new boss_gluttonAI(creature);
+ }
+};
+
+void AddSC_boss_glutton()
+{
+ new boss_glutton();
+}
diff --git a/src/server/scripts/Kalimdor/RazorfenDowns/boss_mordresh_fire_eye.cpp b/src/server/scripts/Kalimdor/RazorfenDowns/boss_mordresh_fire_eye.cpp
new file mode 100644
index 00000000000..1f45de3c4c6
--- /dev/null
+++ b/src/server/scripts/Kalimdor/RazorfenDowns/boss_mordresh_fire_eye.cpp
@@ -0,0 +1,136 @@
+/*
+ * 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/>.
+ */
+
+#include "ScriptMgr.h"
+#include "ScriptedCreature.h"
+#include "razorfen_downs.h"
+
+enum Say
+{
+ SAY_OOC_1 = 0,
+ SAY_OOC_2 = 1,
+ SAY_OOC_3 = 2,
+ SAY_AGGRO = 3
+};
+
+enum Spells
+{
+ SPELL_FIREBALL = 12466,
+ SPELL_FIRE_NOVA = 12470
+};
+
+enum Events
+{
+ EVENT_OOC_1 = 1,
+ EVENT_OOC_2 = 2,
+ EVENT_OOC_3 = 3,
+ EVENT_OOC_4 = 4,
+ EVENT_FIREBALL = 5,
+ EVENT_FIRE_NOVA = 6
+};
+
+class boss_mordresh_fire_eye : public CreatureScript
+{
+public:
+ boss_mordresh_fire_eye() : CreatureScript("boss_mordresh_fire_eye") { }
+
+ struct boss_mordresh_fire_eyeAI : public BossAI
+ {
+ boss_mordresh_fire_eyeAI(Creature* creature) : BossAI(creature, DATA_MORDRESH_FIRE_EYE) { }
+
+ void Reset() OVERRIDE
+ {
+ _Reset();
+ events.ScheduleEvent(EVENT_OOC_1, 10000);
+ }
+
+ void EnterCombat(Unit* /*who*/) OVERRIDE
+ {
+ _EnterCombat();
+ events.Reset();
+ Talk(SAY_AGGRO);
+ events.ScheduleEvent(EVENT_FIREBALL, 100);
+ events.ScheduleEvent(EVENT_FIRE_NOVA, urand(8000, 12000));
+ }
+
+ void JustDied(Unit* /*killer*/) OVERRIDE
+ {
+ _JustDied();
+ }
+
+ void UpdateAI(uint32 diff) OVERRIDE
+ {
+ events.Update(diff);
+
+ if (!UpdateVictim())
+ {
+ while (uint32 eventId = events.ExecuteEvent())
+ {
+ switch (eventId)
+ {
+ case EVENT_OOC_1:
+ Talk(SAY_OOC_1);
+ events.ScheduleEvent(EVENT_OOC_2, 8000);
+ break;
+ case EVENT_OOC_2:
+ Talk(SAY_OOC_2);
+ events.ScheduleEvent(EVENT_OOC_3, 3000);
+ break;
+ case EVENT_OOC_3:
+ me->HandleEmoteCommand(EMOTE_ONESHOT_EXCLAMATION);
+ events.ScheduleEvent(EVENT_OOC_4, 6000);
+ break;
+ case EVENT_OOC_4:
+ Talk(SAY_OOC_3);
+ events.ScheduleEvent(EVENT_OOC_1, 14000);
+ break;
+ }
+ }
+ return;
+ }
+
+ if (me->HasUnitState(UNIT_STATE_CASTING))
+ return;
+
+ while (uint32 eventId = events.ExecuteEvent())
+ {
+ switch (eventId)
+ {
+ case EVENT_FIREBALL:
+ DoCastVictim(SPELL_FIREBALL);
+ events.ScheduleEvent(EVENT_FIREBALL, urand(2400, 3800));
+ break;
+ case EVENT_FIRE_NOVA:
+ DoCast(me, SPELL_FIRE_NOVA);
+ events.ScheduleEvent(EVENT_FIRE_NOVA, urand(11000, 16000));
+ break;
+ }
+ }
+ DoMeleeAttackIfReady();
+ }
+ };
+
+ CreatureAI* GetAI(Creature* creature) const OVERRIDE
+ {
+ return new boss_mordresh_fire_eyeAI(creature);
+ }
+};
+
+void AddSC_boss_mordresh_fire_eye()
+{
+ new boss_mordresh_fire_eye();
+}
diff --git a/src/server/scripts/Kalimdor/RazorfenDowns/boss_tuten_kash.cpp b/src/server/scripts/Kalimdor/RazorfenDowns/boss_tuten_kash.cpp
new file mode 100644
index 00000000000..5cf8a2992a3
--- /dev/null
+++ b/src/server/scripts/Kalimdor/RazorfenDowns/boss_tuten_kash.cpp
@@ -0,0 +1,107 @@
+/*
+ * 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/>.
+ */
+
+#include "ScriptMgr.h"
+#include "ScriptedCreature.h"
+#include "razorfen_downs.h"
+
+enum Spells
+{
+ SPELL_THRASH = 8876,
+ SPELL_WEB_SPRAY = 12252,
+ SPELL_VIRULENT_POISON = 12254,
+ SPELL_CURSE_OF_TUTENKASH = 12255
+};
+
+enum Events
+{
+ EVENT_WEB_SPRAY = 1,
+ EVENT_CURSE_OF_TUTENKASH = 2
+};
+
+class boss_tuten_kash : public CreatureScript
+{
+public:
+ boss_tuten_kash() : CreatureScript("boss_tuten_kash") { }
+
+ struct boss_tuten_kashAI : public BossAI
+ {
+ boss_tuten_kashAI(Creature* creature) : BossAI(creature, DATA_TUTEN_KASH) { }
+
+ void Reset() OVERRIDE
+ {
+ _Reset();
+ if (!me->HasAura(SPELL_THRASH))
+ DoCast(me, SPELL_THRASH);
+ if (!me->HasAura(SPELL_VIRULENT_POISON))
+ DoCast(me, SPELL_VIRULENT_POISON);
+ }
+
+ void EnterCombat(Unit* /*who*/) OVERRIDE
+ {
+ _EnterCombat();
+ events.ScheduleEvent(EVENT_WEB_SPRAY, urand(3000, 5000));
+ events.ScheduleEvent(EVENT_CURSE_OF_TUTENKASH, urand(9000, 14000));
+ }
+
+ void JustDied(Unit* /*killer*/) OVERRIDE
+ {
+ _JustDied();
+ }
+
+ 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_WEB_SPRAY:
+ if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, false))
+ {
+ if (!target->HasAura(SPELL_WEB_SPRAY))
+ DoCast(target, SPELL_WEB_SPRAY);
+ }
+ events.ScheduleEvent(EVENT_WEB_SPRAY, urand(6000, 8000));
+ break;
+ case EVENT_CURSE_OF_TUTENKASH:
+ DoCast(me, SPELL_CURSE_OF_TUTENKASH);
+ events.ScheduleEvent(EVENT_CURSE_OF_TUTENKASH, urand(15000, 25000));
+ break;
+ }
+ }
+ DoMeleeAttackIfReady();
+ }
+ };
+
+ CreatureAI* GetAI(Creature* creature) const OVERRIDE
+ {
+ return new boss_tuten_kashAI(creature);
+ }
+};
+
+void AddSC_boss_tuten_kash()
+{
+ new boss_tuten_kash();
+}
diff --git a/src/server/scripts/Kalimdor/RazorfenDowns/instance_razorfen_downs.cpp b/src/server/scripts/Kalimdor/RazorfenDowns/instance_razorfen_downs.cpp
index 091c7e46585..097f340891a 100644
--- a/src/server/scripts/Kalimdor/RazorfenDowns/instance_razorfen_downs.cpp
+++ b/src/server/scripts/Kalimdor/RazorfenDowns/instance_razorfen_downs.cpp
@@ -16,199 +16,219 @@
*/
#include "ScriptMgr.h"
+#include "ObjectMgr.h"
#include "InstanceScript.h"
#include "razorfen_downs.h"
#include "Player.h"
#include "TemporarySummon.h"
-#define MAX_ENCOUNTER 1
+Position const PosSummonTutenkash[15] =
+{
+ // 7349 Tomb Fiend
+ { 2487.339f, 805.9111f, 43.08361f, 2.844887f },
+ { 2485.405f, 804.1145f, 43.68511f, 3.054326f },
+ { 2488.431f, 801.2809f, 42.70374f, 4.29351f },
+ { 2489.914f, 804.7949f, 43.25175f, 1.658063f },
+ { 2541.246f, 907.0941f, 46.64201f, 2.024582f },
+ { 2544.701f, 907.6331f, 46.38007f, 1.605703f },
+ { 2541.49f, 911.1756f, 46.26493f, 4.817109f },
+ { 2544.693f, 912.8887f, 46.39912f, 2.129302f },
+ { 2524.036f, 834.4852f, 48.37031f, 0.8028514f },
+ { 2527.017f, 829.9793f, 48.06498f, 0.6981317f },
+ // 7351 Tomb Reaver
+ { 2542.818f, 904.9359f, 46.80911f, 4.642576f },
+ { 2543.287f, 911.2448f, 46.32785f, 0.6806784f },
+ { 2489.083f, 806.5914f, 43.21102f, 3.682645f },
+ { 2486.828f, 802.8737f, 43.19883f, 2.9147f },
+ // 7355 Tuten'kash
+ { 2487.939f, 804.2224f, 43.10735f, 1.692969f }
+};
class instance_razorfen_downs : public InstanceMapScript
{
public:
- instance_razorfen_downs() : InstanceMapScript("instance_razorfen_downs", 129) { }
-
- InstanceScript* GetInstanceScript(InstanceMap* map) const OVERRIDE
- {
- return new instance_razorfen_downs_InstanceMapScript(map);
- }
+ instance_razorfen_downs() : InstanceMapScript(RFDScriptName, 129) { }
struct instance_razorfen_downs_InstanceMapScript : public InstanceScript
{
instance_razorfen_downs_InstanceMapScript(Map* map) : InstanceScript(map)
{
+ SetBossNumber(EncounterCount);
}
- uint64 uiGongGUID;
-
- uint32 m_auiEncounter[MAX_ENCOUNTER];
-
- uint16 uiGongWaves;
-
- std::string str_data;
-
void Initialize() OVERRIDE
{
- uiGongGUID = 0;
-
- uiGongWaves = 0;
-
- memset(&m_auiEncounter, 0, sizeof(m_auiEncounter));
- }
-
- std::string GetSaveData() OVERRIDE
- {
- OUT_SAVE_INST_DATA;
-
- std::ostringstream saveStream;
-
- saveStream << "T C " << m_auiEncounter[0]
- << ' ' << uiGongWaves;
-
- str_data = saveStream.str();
-
- OUT_SAVE_INST_DATA_COMPLETE;
- return str_data;
+ goGongGUID = 0;
+ gongWave = 0;
+ fiendsKilled = 0;
+ reaversKilled = 0;
+ summonLowRange = 0;
+ summonHighRange = 0;
+ summonCreature = 0;
}
- void Load(const char* in) OVERRIDE
+ void OnGameObjectCreate(GameObject* gameObject) OVERRIDE
{
- if (!in)
+ switch (gameObject->GetEntry())
{
- OUT_LOAD_INST_DATA_FAIL;
- return;
+ case GO_GONG:
+ goGongGUID = gameObject->GetGUID();
+ if (GetBossState(DATA_TUTEN_KASH) == DONE)
+ gameObject->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE);
+ break;
+ case GO_IDOL_OVEN_FIRE:
+ case GO_IDOL_CUP_FIRE:
+ case GO_IDOL_MOUTH_FIRE:
+ if (GetBossState(DATA_EXTINGUISHING_THE_IDOL) == DONE)
+ gameObject->Delete();
+ break;
+ default:
+ break;
}
-
- OUT_LOAD_INST_DATA(in);
-
- char dataHead1, dataHead2;
- uint16 data0, data1;
-
- std::istringstream loadStream(in);
- loadStream >> dataHead1 >> dataHead2 >> data0 >> data1;
-
- if (dataHead1 == 'T' && dataHead2 == 'C')
- {
- m_auiEncounter[0] = data0;
-
- for (uint8 i = 0; i < MAX_ENCOUNTER; ++i)
- if (m_auiEncounter[i] == IN_PROGRESS)
- m_auiEncounter[i] = NOT_STARTED;
-
- uiGongWaves = data1;
- } else OUT_LOAD_INST_DATA_FAIL;
-
- OUT_LOAD_INST_DATA_COMPLETE;
}
- void OnGameObjectCreate(GameObject* go) OVERRIDE
+ bool SetBossState(uint32 type, EncounterState state) OVERRIDE
{
- switch (go->GetEntry())
+ if (!InstanceScript::SetBossState(type, state))
+ return false;
+
+ switch (type)
{
- case GO_GONG:
- uiGongGUID = go->GetGUID();
- if (m_auiEncounter[0] == DONE)
- go->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE);
+ case DATA_TUTEN_KASH:
+ case DATA_MORDRESH_FIRE_EYE:
+ case DATA_GLUTTON:
+ case DATA_AMNENNAR_THE_COLD_BRINGER:
+ case DATA_GONG:
+ case DATA_WAVE:
+ case DATA_EXTINGUISHING_THE_IDOL:
break;
default:
break;
}
+ return true;
}
- void SetData(uint32 uiType, uint32 uiData) OVERRIDE
+ void SetData(uint32 type, uint32 data) OVERRIDE
{
- if (uiType == DATA_GONG_WAVES)
+ if (type == DATA_WAVE)
{
- uiGongWaves = uiData;
-
- switch (uiGongWaves)
+ switch (data)
{
- case 9:
- case 14:
- if (GameObject* go = instance->GetGameObject(uiGongGUID))
- go->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE);
- break;
- case 1:
- case 10:
- case 16:
+ case IN_PROGRESS:
{
- GameObject* go = instance->GetGameObject(uiGongGUID);
-
- if (!go)
- return;
-
- go->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE);
-
- uint32 uiCreature = 0;
- uint8 uiSummonTimes = 0;
+ if (GameObject* go = instance->GetGameObject(goGongGUID))
+ go->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE);
- switch (uiGongWaves)
+ switch (gongWave)
{
- case 1:
- uiCreature = NPC_TOMB_FIEND;
- uiSummonTimes = 7;
- break;
- case 10:
- uiCreature = NPC_TOMB_REAVER;
- uiSummonTimes = 3;
+ case 0:
+ summonLowRange = 0;
+ summonHighRange = 10;
+ summonCreature = NPC_TOMB_FIEND;
break;
- case 16:
- uiCreature = NPC_TUTEN_KASH;
+ case 1:
+ summonLowRange = 10;
+ summonHighRange = 14;
+ summonCreature = NPC_TOMB_REAVER;
break;
- default:
+ case 2:
+ summonLowRange = 14;
+ summonHighRange = 15;
+ summonCreature = NPC_TUTEN_KASH;
break;
}
- if (Creature* creature = go->SummonCreature(uiCreature, 2502.635f, 844.140f, 46.896f, 0.633f))
+ if (GameObject* go = instance->GetGameObject(goGongGUID))
{
- if (uiGongWaves == 10 || uiGongWaves == 1)
+ for (uint8 i = summonLowRange; i < summonHighRange; ++i)
{
- for (uint8 i = 0; i < uiSummonTimes; ++i)
- {
- if (Creature* summon = go->SummonCreature(uiCreature, 2502.635f + float(irand(-5, 5)), 844.140f + float(irand(-5, 5)), 46.896f, 0.633f))
- summon->GetMotionMaster()->MovePoint(0, 2533.479f + float(irand(-5, 5)), 870.020f + float(irand(-5, 5)), 47.678f);
- }
+ Creature* creature = go->SummonCreature(summonCreature, PosSummonTutenkash[i]);
+ creature->GetMotionMaster()->MovePoint(0, 2533.479f + float(irand(-5, 5)), 870.020f + float(irand(-5, 5)), 47.678f);
}
- creature->GetMotionMaster()->MovePoint(0, 2533.479f + float(irand(-5, 5)), 870.020f + float(irand(-5, 5)), 47.678f);
}
+
+ ++gongWave;
break;
}
- default:
+ case NPC_TOMB_FIEND:
+ if (++fiendsKilled == 10)
+ {
+ fiendsKilled = 0;
+ if (GameObject* go = instance->GetGameObject(goGongGUID))
+ go->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE);
+ }
+ break;
+ case NPC_TOMB_REAVER:
+ if (++reaversKilled == 4)
+ {
+ reaversKilled = 0;
+ if (GameObject* go = instance->GetGameObject(goGongGUID))
+ go->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE);
+ }
break;
}
+
}
- if (uiType == BOSS_TUTEN_KASH)
- {
- m_auiEncounter[0] = uiData;
+ }
- if (uiData == DONE)
- SaveToDB();
- }
+ std::string GetSaveData() OVERRIDE
+ {
+ OUT_SAVE_INST_DATA;
+
+ std::ostringstream saveStream;
+ saveStream << "R D " << GetBossSaveData();
+
+ OUT_SAVE_INST_DATA_COMPLETE;
+ return saveStream.str();
}
- uint32 GetData(uint32 uiType) const OVERRIDE
+ void Load(const char* str) OVERRIDE
{
- switch (uiType)
+ if (!str)
{
- case DATA_GONG_WAVES:
- return uiGongWaves;
+ OUT_LOAD_INST_DATA_FAIL;
+ return;
}
- return 0;
- }
+ OUT_LOAD_INST_DATA(str);
- uint64 GetData64(uint32 uiType) const OVERRIDE
- {
- switch (uiType)
+ char dataHead1, dataHead2;
+
+ std::istringstream loadStream(str);
+ loadStream >> dataHead1 >> dataHead2;
+
+ if (dataHead1 == 'R' && dataHead2 == 'D')
{
- case DATA_GONG: return uiGongGUID;
+ for (uint32 i = 0; i < EncounterCount; ++i)
+ {
+ uint32 tmpState;
+ loadStream >> tmpState;
+ if (tmpState == IN_PROGRESS || tmpState > SPECIAL)
+ tmpState = NOT_STARTED;
+ SetBossState(i, EncounterState(tmpState));
+ }
}
+ else
+ OUT_LOAD_INST_DATA_FAIL;
- return 0;
+ OUT_LOAD_INST_DATA_COMPLETE;
}
+
+ protected:
+ uint64 goGongGUID;
+ uint16 gongWave;
+ uint8 fiendsKilled;
+ uint8 reaversKilled;
+ uint8 summonLowRange;
+ uint8 summonHighRange;
+ uint32 summonCreature;
};
+ InstanceScript* GetInstanceScript(InstanceMap* map) const OVERRIDE
+ {
+ return new instance_razorfen_downs_InstanceMapScript(map);
+ }
};
void AddSC_instance_razorfen_downs()
diff --git a/src/server/scripts/Kalimdor/RazorfenDowns/razorfen_downs.cpp b/src/server/scripts/Kalimdor/RazorfenDowns/razorfen_downs.cpp
index 320c9970077..3300f0d811b 100644
--- a/src/server/scripts/Kalimdor/RazorfenDowns/razorfen_downs.cpp
+++ b/src/server/scripts/Kalimdor/RazorfenDowns/razorfen_downs.cpp
@@ -32,6 +32,10 @@ EndContentData */
#include "ScriptedGossip.h"
#include "razorfen_downs.h"
#include "Player.h"
+#include "GridNotifiers.h"
+#include "GridNotifiersImpl.h"
+#include "Cell.h"
+#include "CellImpl.h"
/*###
# npc_henry_stern
@@ -101,32 +105,272 @@ public:
};
/*######
-## go_gong
+## npc_belnistrasz for Quest 3525 "Extinguishing the Idol"
######*/
-class go_gong : public GameObjectScript
+Position const PosSummonSpawner[3] =
+{
+ { 2582.789f, 954.3925f, 52.48214f, 3.787364f },
+ { 2569.42f, 956.3801f, 52.27323f, 5.427974f },
+ { 2570.62f, 942.3934f, 53.7433f, 0.715585f }
+};
+
+enum Belnistrasz
+{
+ EVENT_CHANNEL = 1,
+ EVENT_IDOL_ROOM_SPAWNER = 2,
+ EVENT_PROGRESS = 3,
+ EVENT_COMPLETE = 4,
+ EVENT_FIREBALL = 5,
+ EVENT_FROST_NOVA = 6,
+
+ FACTION_ESCORT = 250,
+
+ PATH_ESCORT = 871710,
+ POINT_REACH_IDOL = 17,
+
+ QUEST_EXTINGUISHING_THE_IDOL = 3525,
+
+ SAY_QUEST_ACCEPTED = 0,
+ SAY_EVENT_START = 1,
+ SAY_EVENT_THREE_MIN_LEFT = 2,
+ SAY_EVENT_TWO_MIN_LEFT = 3,
+ SAY_EVENT_ONE_MIN_LEFT = 4,
+ SAY_EVENT_END = 5,
+ SAY_AGGRO = 6, // Combat
+ SAY_WATCH_OUT = 7, // 25% chance to target random creature and say on wave spawn
+
+ SPELL_ARCANE_INTELLECT = 13326,
+ SPELL_FIREBALL = 9053,
+ SPELL_FROST_NOVA = 11831,
+ SPELL_IDOL_SHUTDOWN_VISUAL = 12774, // Hits Unit Entry: 8662
+ SPELL_IDOM_ROOM_CAMERA_SHAKE = 12816 // Dummy needs scripting
+};
+
+class npc_belnistrasz : public CreatureScript
{
public:
- go_gong() : GameObjectScript("go_gong") { }
+ npc_belnistrasz() : CreatureScript("npc_belnistrasz") { }
- bool OnGossipHello(Player* /*player*/, GameObject* go) OVERRIDE
+ struct npc_belnistraszAI : public ScriptedAI
{
- //basic support, not blizzlike data is missing...
- InstanceScript* instance = go->GetInstanceScript();
+ npc_belnistraszAI(Creature* creature) : ScriptedAI(creature)
+ {
+ instance = creature->GetInstanceScript();
+ eventInProgress = false;
+ }
- if (instance)
+ void Reset() OVERRIDE
{
- instance->SetData(DATA_GONG_WAVES, instance->GetData(DATA_GONG_WAVES)+1);
- return true;
+ if (!eventInProgress)
+ {
+ if (!me->HasAura(SPELL_ARCANE_INTELLECT))
+ DoCast(me, SPELL_ARCANE_INTELLECT);
+
+ channeling = false;
+ eventProgress = 0;
+ spawnerCount = 0;
+ me->SetFlag(UNIT_NPC_FLAGS, GOSSIP_OPTION_QUESTGIVER);
+ }
}
- return false;
+ void EnterCombat(Unit* who) OVERRIDE
+ {
+ if (channeling)
+ {
+ Talk(SAY_WATCH_OUT, who->GetGUID());
+ }
+ else
+ {
+ events.ScheduleEvent(EVENT_FIREBALL, 1000);
+ events.ScheduleEvent(EVENT_FROST_NOVA, urand(8000, 12000));
+ if (urand(0, 100) > 40)
+ Talk(SAY_AGGRO, who->GetGUID());
+ }
+ }
+
+ void JustDied(Unit* /*killer*/) OVERRIDE
+ {
+ instance->SetBossState(DATA_EXTINGUISHING_THE_IDOL, DONE);
+ me->DespawnOrUnsummon(5000);
+ }
+
+ void sQuestAccept(Player* /*player*/, Quest const* quest) OVERRIDE
+ {
+ if (quest->GetQuestId() == QUEST_EXTINGUISHING_THE_IDOL)
+ {
+ eventInProgress = true;
+ Talk(SAY_QUEST_ACCEPTED);
+ me->RemoveFlag(UNIT_NPC_FLAGS, GOSSIP_OPTION_QUESTGIVER);
+ me->setFaction(FACTION_ESCORT);
+ me->GetMotionMaster()->MovePath(PATH_ESCORT, false);
+ }
+ }
+
+ void MovementInform(uint32 type, uint32 id) OVERRIDE
+ {
+ if (type == WAYPOINT_MOTION_TYPE && id == POINT_REACH_IDOL)
+ {
+ channeling = true;
+ events.ScheduleEvent(EVENT_CHANNEL, 2000);
+ }
+ }
+
+ void UpdateAI(uint32 diff) OVERRIDE
+ {
+ if (!eventInProgress)
+ return;
+
+ events.Update(diff);
+
+ while (uint32 eventId = events.ExecuteEvent())
+ {
+ switch (eventId)
+ {
+ case EVENT_CHANNEL:
+ Talk(SAY_EVENT_START);
+ DoCast(me, SPELL_IDOL_SHUTDOWN_VISUAL);
+ events.ScheduleEvent(EVENT_IDOL_ROOM_SPAWNER, 100);
+ events.ScheduleEvent(EVENT_PROGRESS, 120000);
+ break;
+ case EVENT_IDOL_ROOM_SPAWNER:
+ if (Creature* creature = me->SummonCreature(NPC_IDOL_ROOM_SPAWNER, PosSummonSpawner[urand(0,2)], TEMPSUMMON_TIMED_DESPAWN, 4000))
+ creature->AI()->SetData(0,spawnerCount);
+ if (++spawnerCount < 8)
+ events.ScheduleEvent(EVENT_IDOL_ROOM_SPAWNER, 35000);
+ break;
+ case EVENT_PROGRESS:
+ {
+ switch (eventProgress)
+ {
+ case 0:
+ Talk(SAY_EVENT_THREE_MIN_LEFT);
+ ++eventProgress;
+ events.ScheduleEvent(EVENT_PROGRESS, 60000);
+ break;
+ case 1:
+ Talk(SAY_EVENT_TWO_MIN_LEFT);
+ ++eventProgress;
+ events.ScheduleEvent(EVENT_PROGRESS, 60000);
+ break;
+ case 2:
+ Talk(SAY_EVENT_ONE_MIN_LEFT);
+ ++eventProgress;
+ events.ScheduleEvent(EVENT_PROGRESS, 60000);
+ break;
+ case 3:
+ events.CancelEvent(EVENT_IDOL_ROOM_SPAWNER);
+ me->InterruptSpell(CURRENT_CHANNELED_SPELL);
+ Talk(SAY_EVENT_END);
+ events.ScheduleEvent(EVENT_COMPLETE, 3000);
+ break;
+ }
+ break;
+ }
+ case EVENT_COMPLETE:
+ {
+ DoCast(me, SPELL_IDOM_ROOM_CAMERA_SHAKE);
+ me->SummonGameObject(GO_BELNISTRASZS_BRAZIER, 2577.196f, 947.0781f, 53.16757f, 2.356195f, 0, 0, 0.9238796f, 0.3826832f, 3600000);
+ std::list<WorldObject*> ClusterList;
+ Trinity::AllWorldObjectsInRange objects(me, 50.0f);
+ Trinity::WorldObjectListSearcher<Trinity::AllWorldObjectsInRange> searcher(me, ClusterList, objects);
+ me->VisitNearbyObject(50.0f, searcher);
+ for (std::list<WorldObject*>::const_iterator itr = ClusterList.begin(); itr != ClusterList.end(); ++itr)
+ {
+ if (Player* player = (*itr)->ToPlayer())
+ {
+ if (player->GetQuestStatus(QUEST_EXTINGUISHING_THE_IDOL) == QUEST_STATUS_INCOMPLETE)
+ player->CompleteQuest(QUEST_EXTINGUISHING_THE_IDOL);
+ }
+ else if (GameObject* go = (*itr)->ToGameObject())
+ {
+ if (go->GetEntry() == GO_IDOL_OVEN_FIRE || go->GetEntry() == GO_IDOL_CUP_FIRE || go->GetEntry() == GO_IDOL_MOUTH_FIRE)
+ go->Delete();
+ }
+ }
+ instance->SetBossState(DATA_EXTINGUISHING_THE_IDOL, DONE);
+ me->DespawnOrUnsummon();
+ break;
+ }
+ case EVENT_FIREBALL:
+ if (me->HasUnitState(UNIT_STATE_CASTING) || !UpdateVictim())
+ return;
+ DoCastVictim(SPELL_FIREBALL);
+ events.ScheduleEvent(EVENT_FIREBALL, 8000);
+ break;
+ case EVENT_FROST_NOVA:
+ if (me->HasUnitState(UNIT_STATE_CASTING) || !UpdateVictim())
+ return;
+ DoCast(me, SPELL_FROST_NOVA);
+ events.ScheduleEvent(EVENT_FROST_NOVA, 15000);
+ break;
+ }
+ }
+ if (!channeling)
+ DoMeleeAttackIfReady();
+ }
+
+ private:
+ InstanceScript* instance;
+ EventMap events;
+ bool eventInProgress;
+ bool channeling;
+ uint8 eventProgress;
+ uint8 spawnerCount;
+ };
+
+ CreatureAI* GetAI(Creature* creature) const OVERRIDE
+ {
+ return new npc_belnistraszAI(creature);
}
+};
+
+class npc_idol_room_spawner : public CreatureScript
+{
+public:
+ npc_idol_room_spawner() : CreatureScript("npc_idol_room_spawner") { }
+
+ struct npc_idol_room_spawnerAI : public ScriptedAI
+ {
+ npc_idol_room_spawnerAI(Creature* creature) : ScriptedAI(creature)
+ {
+ instance = creature->GetInstanceScript();
+ }
+
+ void Reset() OVERRIDE { }
+ void SetData(uint32 /*type*/, uint32 data) OVERRIDE
+ {
+ if (!instance)
+ return;
+
+ if (data < 7)
+ {
+ me->SummonCreature(NPC_WITHERED_BATTLE_BOAR, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), me->GetOrientation());
+ if (data > 0 && me->GetOrientation() < 4.0f)
+ me->SummonCreature(NPC_WITHERED_BATTLE_BOAR, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), me->GetOrientation());
+ me->SummonCreature(NPC_DEATHS_HEAD_GEOMANCER, me->GetPositionX() + (cos(me->GetOrientation() - (M_PI/2)) * 2), me->GetPositionY() + (sin(me->GetOrientation() - (M_PI/2)) * 2), me->GetPositionZ(), me->GetOrientation());
+ me->SummonCreature(NPC_WITHERED_QUILGUARD, me->GetPositionX() + (cos(me->GetOrientation() + (M_PI/2)) * 2), me->GetPositionY() + (sin(me->GetOrientation() + (M_PI/2)) * 2), me->GetPositionZ(), me->GetOrientation());
+ }
+ else if (data == 7)
+ me->SummonCreature(NPC_PLAGUEMAW_THE_ROTTING, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), me->GetOrientation());
+ }
+
+ private:
+ InstanceScript* instance;
+ };
+
+ CreatureAI* GetAI(Creature* creature) const OVERRIDE
+ {
+ return new npc_idol_room_spawnerAI(creature);
+ }
};
enum TombCreature
{
+ EVENT_WEB = 7,
+ SPELL_POISON_PROC = 3616,
+ SPELL_VIRULENT_POISON_PROC = 12254,
SPELL_WEB = 745
};
@@ -135,11 +379,6 @@ class npc_tomb_creature : public CreatureScript
public:
npc_tomb_creature() : CreatureScript("npc_tomb_creature") { }
- CreatureAI* GetAI(Creature* creature) const OVERRIDE
- {
- return new npc_tomb_creatureAI(creature);
- }
-
struct npc_tomb_creatureAI : public ScriptedAI
{
npc_tomb_creatureAI(Creature* creature) : ScriptedAI(creature)
@@ -147,45 +386,86 @@ public:
instance = creature->GetInstanceScript();
}
- InstanceScript* instance;
+ void Reset() OVERRIDE
+ {
+ if (!me->HasAura(SPELL_POISON_PROC) && me->GetEntry() == NPC_TOMB_FIEND)
+ DoCast(me, SPELL_POISON_PROC);
- uint32 uiWebTimer;
+ if (!me->HasAura(SPELL_VIRULENT_POISON_PROC) && me->GetEntry() == NPC_TOMB_REAVER)
+ DoCast(me, SPELL_VIRULENT_POISON_PROC);
+ }
- void Reset() OVERRIDE
+ void JustDied(Unit* /*killer*/) OVERRIDE
+ {
+ if (instance)
+ instance->SetData(DATA_WAVE, me->GetEntry());
+ }
+
+ void EnterCombat(Unit* /*who*/) OVERRIDE
{
- uiWebTimer = urand(5000, 8000);
+ events.ScheduleEvent(EVENT_WEB, urand(5000, 8000));
}
- void UpdateAI(uint32 uiDiff) OVERRIDE
+ void UpdateAI(uint32 diff) OVERRIDE
{
if (!UpdateVictim())
return;
- //from acid
- if (me->GetEntry() == NPC_TOMB_REAVER)
+ events.Update(diff);
+
+ while (uint32 eventId = events.ExecuteEvent())
{
- if (uiWebTimer <= uiDiff)
+ switch (eventId)
{
- DoCastVictim(SPELL_WEB);
- uiWebTimer = urand(7000, 16000);
- } else uiWebTimer -= uiDiff;
+ case EVENT_WEB:
+ DoCastVictim(SPELL_WEB);
+ events.ScheduleEvent(EVENT_WEB, urand(7000, 16000));
+ break;
+ }
}
-
DoMeleeAttackIfReady();
}
- void JustDied(Unit* /*killer*/) OVERRIDE
+ private:
+ InstanceScript* instance;
+ EventMap events;
+ };
+
+ CreatureAI* GetAI(Creature* creature) const OVERRIDE
+ {
+ return new npc_tomb_creatureAI(creature);
+ }
+};
+
+/*######
+## go_gong
+######*/
+
+class go_gong : public GameObjectScript
+{
+public:
+ go_gong() : GameObjectScript("go_gong") { }
+
+ bool OnGossipHello(Player* /*player*/, GameObject* go) OVERRIDE
+ {
+ InstanceScript* instance = go->GetInstanceScript();
+
+ if (instance)
{
- if (instance)
- instance->SetData(DATA_GONG_WAVES, instance->GetData(DATA_GONG_WAVES)+1);
+ go->SendCustomAnim(0);
+ instance->SetData(DATA_WAVE, IN_PROGRESS);
+ return true;
}
- };
+ return false;
+ }
};
void AddSC_razorfen_downs()
{
new npc_henry_stern();
- new go_gong();
+ new npc_belnistrasz();
+ new npc_idol_room_spawner();
new npc_tomb_creature();
+ new go_gong();
}
diff --git a/src/server/scripts/Kalimdor/RazorfenDowns/razorfen_downs.h b/src/server/scripts/Kalimdor/RazorfenDowns/razorfen_downs.h
index c0f63474f23..9fe5314fda0 100644
--- a/src/server/scripts/Kalimdor/RazorfenDowns/razorfen_downs.h
+++ b/src/server/scripts/Kalimdor/RazorfenDowns/razorfen_downs.h
@@ -18,27 +18,56 @@
#ifndef DEF_RAZORFEN_DOWNS_H
#define DEF_RAZORFEN_DOWNS_H
-enum Data
+#define RFDScriptName "instance_razorfen_downs"
+
+uint32 const EncounterCount = 5;
+
+enum DataTypes
{
- BOSS_TUTEN_KASH,
- DATA_GONG_WAVES
+ // Main Bosses
+ DATA_TUTEN_KASH = 0,
+ DATA_MORDRESH_FIRE_EYE = 1,
+ DATA_GLUTTON = 2,
+ DATA_AMNENNAR_THE_COLD_BRINGER = 3,
+ // Events
+ DATA_GONG = 4,
+ DATA_WAVE = 5,
+ DATA_EXTINGUISHING_THE_IDOL = 6
};
-enum Data64
+enum CreatureIds
{
- DATA_GONG
+ // Used in Tuten Kash summon event
+ NPC_TOMB_FIEND = 7349,
+ NPC_TOMB_REAVER = 7351,
+ NPC_TUTEN_KASH = 7355,
+ // Used for quest 3525 "Extinguishing the Idol"
+ NPC_IDOL_ROOM_SPAWNER = 8611,
+ NPC_WITHERED_BATTLE_BOAR = 7333,
+ NPC_DEATHS_HEAD_GEOMANCER = 7335,
+ NPC_WITHERED_QUILGUARD = 7329,
+ NPC_PLAGUEMAW_THE_ROTTING = 7356
};
enum GameObjectIds
{
- GO_GONG = 148917
+ // Used for Tuten Kash summon event
+ GO_GONG = 148917,
+ // Used for quest 3525 "Extinguishing the Idol"
+ GO_IDOL_OVEN_FIRE = 151951,
+ GO_IDOL_CUP_FIRE = 151952,
+ GO_IDOL_MOUTH_FIRE = 151973,
+ GO_BELNISTRASZS_BRAZIER = 152097
};
-enum CreatureId
+template<class AI>
+CreatureAI* GetRazorfenDownsAI(Creature* creature)
{
- NPC_TOMB_FIEND = 7349,
- NPC_TOMB_REAVER = 7351,
- NPC_TUTEN_KASH = 7355
-};
+ if (InstanceMap* instance = creature->GetMap()->ToInstanceMap())
+ if (instance->GetInstanceScript())
+ if (instance->GetScriptId() == sObjectMgr->GetScriptId(RFDScriptName))
+ return new AI(creature);
+ return NULL;
+}
#endif
diff --git a/src/server/scripts/Kalimdor/RazorfenKraul/razorfen_kraul.cpp b/src/server/scripts/Kalimdor/RazorfenKraul/razorfen_kraul.cpp
index ee8618eacc9..35fea896a10 100644
--- a/src/server/scripts/Kalimdor/RazorfenKraul/razorfen_kraul.cpp
+++ b/src/server/scripts/Kalimdor/RazorfenKraul/razorfen_kraul.cpp
@@ -176,6 +176,7 @@ public:
void Reset() OVERRIDE
{
IsMovementActive = false;
+ TargetTubberGUID = 0;
}
void MovementInform(uint32 type, uint32 id) OVERRIDE
diff --git a/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_cthun.cpp b/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_cthun.cpp
index d1f0bb10ecd..d2b5b5eaf8c 100644
--- a/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_cthun.cpp
+++ b/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_cthun.cpp
@@ -922,6 +922,7 @@ public:
{
eye_tentacleAI(Creature* creature) : ScriptedAI(creature)
{
+ Portal = 0;
if (Creature* pPortal = me->SummonCreature(NPC_SMALL_PORTAL, *me, TEMPSUMMON_CORPSE_DESPAWN))
{
pPortal->SetReactState(REACT_PASSIVE);
@@ -999,6 +1000,7 @@ public:
{
SetCombatMovement(false);
+ Portal = 0;
if (Creature* pPortal = me->SummonCreature(NPC_SMALL_PORTAL, *me, TEMPSUMMON_CORPSE_DESPAWN))
{
pPortal->SetReactState(REACT_PASSIVE);
@@ -1109,6 +1111,7 @@ public:
{
SetCombatMovement(false);
+ Portal = 0;
if (Creature* pPortal = me->SummonCreature(NPC_GIANT_PORTAL, *me, TEMPSUMMON_CORPSE_DESPAWN))
{
pPortal->SetReactState(REACT_PASSIVE);
@@ -1228,6 +1231,7 @@ public:
{
SetCombatMovement(false);
+ Portal = 0;
if (Creature* pPortal = me->SummonCreature(NPC_GIANT_PORTAL, *me, TEMPSUMMON_CORPSE_DESPAWN))
{
pPortal->SetReactState(REACT_PASSIVE);
diff --git a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_northrend_beasts.cpp b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_northrend_beasts.cpp
index 8f6b951d524..3fdfc0c8ae3 100644
--- a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_northrend_beasts.cpp
+++ b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_northrend_beasts.cpp
@@ -310,8 +310,6 @@ class npc_snobold_vassal : public CreatureScript
_targetGUID = 0;
_targetDied = false;
- if (_instance)
- _bossGUID = _instance->GetData64(NPC_GORMOK);
//Workaround for Snobold
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_NOT_SELECTABLE);
}
@@ -450,7 +448,6 @@ class npc_snobold_vassal : public CreatureScript
private:
EventMap _events;
InstanceScript* _instance;
- uint64 _bossGUID;
uint64 _targetGUID;
bool _targetDied;
};
diff --git a/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/halls_of_reflection.cpp b/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/halls_of_reflection.cpp
index 6b746222a72..96b772df5a9 100644
--- a/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/halls_of_reflection.cpp
+++ b/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/halls_of_reflection.cpp
@@ -1121,6 +1121,7 @@ enum TrashSpells
SPELL_FROSTBOLT = 72166,
SPELL_CHAINS_OF_ICE = 72121,
SPELL_HALLUCINATION = 72342,
+ AURA_HALLUCINATION = 72343,
// Phantom Hallucination (same as phantom mage + HALLUCINATION_2 when dies)
SPELL_HALLUCINATION_2 = 72344,
@@ -1180,13 +1181,11 @@ enum TrashEvents
struct npc_gauntlet_trash : public ScriptedAI
{
- npc_gauntlet_trash(Creature* creature) : ScriptedAI(creature),
- _instance(creature->GetInstanceScript())
- {
- }
+ npc_gauntlet_trash(Creature* creature) : ScriptedAI(creature), _instance(creature->GetInstanceScript()) { }
void Reset() OVERRIDE
{
+ InternalWaveId = 0;
me->CastSpell(me, SPELL_WELL_OF_SOULS, true);
_events.Reset();
}
@@ -1226,9 +1225,7 @@ public:
struct npc_ghostly_priestAI : public npc_gauntlet_trash
{
- npc_ghostly_priestAI(Creature* creature) : npc_gauntlet_trash(creature)
- {
- }
+ npc_ghostly_priestAI(Creature* creature) : npc_gauntlet_trash(creature) { }
void EnterCombat(Unit* /*who*/) OVERRIDE
{
@@ -1297,8 +1294,12 @@ public:
struct npc_phantom_mageAI : public npc_gauntlet_trash
{
- npc_phantom_mageAI(Creature* creature) : npc_gauntlet_trash(creature)
+ npc_phantom_mageAI(Creature* creature) : npc_gauntlet_trash(creature) { }
+
+ void EnterEvadeMode() OVERRIDE
{
+ if (!me->HasAura(AURA_HALLUCINATION))
+ npc_gauntlet_trash::EnterEvadeMode();
}
void EnterCombat(Unit* /*who*/) OVERRIDE
@@ -1342,6 +1343,8 @@ public:
_events.ScheduleEvent(EVENT_CHAINS_OF_ICE, 15000);
break;
case EVENT_HALLUCINATION:
+ // removing any dots on mage or else the invisibility spell will break duration
+ me->RemoveAllAuras();
DoCast(SPELL_HALLUCINATION);
break;
}
@@ -1365,6 +1368,19 @@ public:
{
npc_phantom_hallucinationAI(Creature* creature) : npc_phantom_mage::npc_phantom_mageAI(creature) { }
+ void Reset() OVERRIDE
+ {
+ if (Unit* unit = me->SelectNearestTarget())
+ AttackStart(unit);
+ DoZoneInCombat();
+ }
+
+ void EnterEvadeMode() OVERRIDE
+ {
+ if (!me->GetOwner()->HasAura(AURA_HALLUCINATION))
+ npc_phantom_mage::npc_phantom_mageAI::EnterEvadeMode();
+ }
+
void JustDied(Unit* /*killer*/) OVERRIDE
{
DoCast(SPELL_HALLUCINATION_2);
@@ -1384,9 +1400,7 @@ public:
struct npc_shadowy_mercenaryAI : public npc_gauntlet_trash
{
- npc_shadowy_mercenaryAI(Creature* creature) : npc_gauntlet_trash(creature)
- {
- }
+ npc_shadowy_mercenaryAI(Creature* creature) : npc_gauntlet_trash(creature) { }
void EnterCombat(Unit* /*who*/) OVERRIDE
{
@@ -1444,9 +1458,7 @@ public:
struct npc_spectral_footmanAI : public npc_gauntlet_trash
{
- npc_spectral_footmanAI(Creature* creature) : npc_gauntlet_trash(creature)
- {
- }
+ npc_spectral_footmanAI(Creature* creature) : npc_gauntlet_trash(creature) { }
void EnterCombat(Unit* /*who*/) OVERRIDE
{
@@ -1498,9 +1510,7 @@ public:
struct npc_tortured_riflemanAI : public npc_gauntlet_trash
{
- npc_tortured_riflemanAI(Creature* creature) : npc_gauntlet_trash(creature)
- {
- }
+ npc_tortured_riflemanAI(Creature* creature) : npc_gauntlet_trash(creature) { }
void EnterCombat(Unit* /*who*/) OVERRIDE
{
diff --git a/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/instance_halls_of_reflection.cpp b/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/instance_halls_of_reflection.cpp
index 0599596fc0a..955f4fb1568 100644
--- a/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/instance_halls_of_reflection.cpp
+++ b/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/instance_halls_of_reflection.cpp
@@ -110,10 +110,13 @@ public:
void OnCreatureCreate(Creature* creature) OVERRIDE
{
- Map::PlayerList const& players = instance->GetPlayers();
- if (!players.isEmpty())
- if (Player* player = players.begin()->GetSource())
- _teamInInstance = player->GetTeam();
+ if (!_teamInInstance)
+ {
+ Map::PlayerList const& players = instance->GetPlayers();
+ if (!players.isEmpty())
+ if (Player* player = players.begin()->GetSource())
+ _teamInInstance = player->GetTeam();
+ }
switch (creature->GetEntry())
{
@@ -184,7 +187,7 @@ public:
case GO_ARTHAS_DOOR:
_arthasDoorGUID = go->GetGUID();
go->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_INTERACT_COND);
- if (GetBossState(DATA_FROSWORN_EVENT) == DONE)
+ if (GetData(DATA_FROSWORN_EVENT) == DONE)
HandleGameObject(0, true, go);
else
HandleGameObject(0, false, go);
@@ -511,13 +514,13 @@ public:
OUT_SAVE_INST_DATA;
std::ostringstream saveStream;
- saveStream << "H R " << GetBossSaveData() << _introEvent << ' ' << _frostwornGeneral << _escapeevent;
+ saveStream << "H R " << GetBossSaveData() << _introEvent << ' ' << _frostwornGeneral << ' ' << _escapeevent;
OUT_SAVE_INST_DATA_COMPLETE;
return saveStream.str();
}
- void Load(char const* in) OVERRIDE OVERRIDE
+ void Load(char const* in) OVERRIDE
{
if (!in)
{
diff --git a/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/boss_forgemaster_garfrost.cpp b/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/boss_forgemaster_garfrost.cpp
index 20b7d39815f..4a9a41f6f8e 100644
--- a/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/boss_forgemaster_garfrost.cpp
+++ b/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/boss_forgemaster_garfrost.cpp
@@ -187,7 +187,7 @@ class boss_garfrost : public CreatureScript
switch (eventId)
{
case EVENT_THROW_SARONITE:
- if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0))
+ if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 0.0f, true))
{
Talk(SAY_THROW_SARONITE, target->GetGUID());
DoCast(target, SPELL_THROW_SARONITE);
@@ -199,7 +199,7 @@ class boss_garfrost : public CreatureScript
events.ScheduleEvent(EVENT_CHILLING_WAVE, 40000, 0, PHASE_TWO);
break;
case EVENT_DEEP_FREEZE:
- if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0))
+ if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 0.0f, true))
{
Talk(SAY_CAST_DEEP_FREEZE, target->GetGUID());
DoCast(target, SPELL_DEEP_FREEZE);
diff --git a/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/instance_pit_of_saron.cpp b/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/instance_pit_of_saron.cpp
index 7aa8b123f98..d61fc69a0ae 100644
--- a/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/instance_pit_of_saron.cpp
+++ b/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/instance_pit_of_saron.cpp
@@ -63,7 +63,7 @@ class instance_pit_of_saron : public InstanceMapScript
{
if (!_teamInInstance)
{
- Map::PlayerList const &players = instance->GetPlayers();
+ Map::PlayerList const& players = instance->GetPlayers();
if (!players.isEmpty())
if (Player* player = players.begin()->GetSource())
_teamInInstance = player->GetTeam();
diff --git a/src/server/scripts/Northrend/Naxxramas/boss_gothik.cpp b/src/server/scripts/Northrend/Naxxramas/boss_gothik.cpp
index 68387279c1d..f76c46d96ff 100644
--- a/src/server/scripts/Northrend/Naxxramas/boss_gothik.cpp
+++ b/src/server/scripts/Northrend/Naxxramas/boss_gothik.cpp
@@ -514,6 +514,7 @@ class npc_gothik_minion : public CreatureScript
npc_gothik_minionAI(Creature* creature) : CombatAI(creature)
{
liveSide = IN_LIVE_SIDE(me);
+ gateClose = false;
}
bool liveSide;
diff --git a/src/server/scripts/Northrend/Nexus/EyeOfEternity/instance_eye_of_eternity.cpp b/src/server/scripts/Northrend/Nexus/EyeOfEternity/instance_eye_of_eternity.cpp
index a1511fb3dd8..4777b451e4e 100644
--- a/src/server/scripts/Northrend/Nexus/EyeOfEternity/instance_eye_of_eternity.cpp
+++ b/src/server/scripts/Northrend/Nexus/EyeOfEternity/instance_eye_of_eternity.cpp
@@ -165,7 +165,7 @@ public:
unit->SetControlled(true, UNIT_STATE_ROOT);
}
- void ProcessEvent(WorldObject* /*obj*/, uint32 eventId)
+ void ProcessEvent(WorldObject* /*obj*/, uint32 eventId) OVERRIDE
{
if (eventId == EVENT_FOCUSING_IRIS)
{
diff --git a/src/server/scripts/Northrend/Nexus/Oculus/instance_oculus.cpp b/src/server/scripts/Northrend/Nexus/Oculus/instance_oculus.cpp
index 96fadc7002b..b108378910e 100644
--- a/src/server/scripts/Northrend/Nexus/Oculus/instance_oculus.cpp
+++ b/src/server/scripts/Northrend/Nexus/Oculus/instance_oculus.cpp
@@ -179,7 +179,7 @@ class instance_oculus : public InstanceMapScript
}
}
- void ProcessEvent(WorldObject* /*unit*/, uint32 eventId)
+ void ProcessEvent(WorldObject* /*unit*/, uint32 eventId) OVERRIDE
{
if (eventId != EVENT_CALL_DRAGON)
return;
diff --git a/src/server/scripts/Northrend/Nexus/Oculus/oculus.cpp b/src/server/scripts/Northrend/Nexus/Oculus/oculus.cpp
index 4b24e5a81fb..1230868c020 100644
--- a/src/server/scripts/Northrend/Nexus/Oculus/oculus.cpp
+++ b/src/server/scripts/Northrend/Nexus/Oculus/oculus.cpp
@@ -38,44 +38,45 @@ enum GossipNPCs
enum Drakes
{
-/*Ruby Drake,
-(npc 27756) (item 37860)
-(summoned by spell Ruby Essence = 37860 ---> Call Amber Drake == 49462 ---> Summon 27756)
-*/
- SPELL_RIDE_RUBY_DRAKE_QUE = 49463, //Apply Aura: Periodic Trigger, Interval: 3 seconds ---> 49464
- SPELL_RUBY_DRAKE_SADDLE = 49464, //Allows you to ride on the back of an Amber Drake. ---> Dummy
- SPELL_RUBY_SEARING_WRATH = 50232, //(60 yds) - Instant - Breathes a stream of fire at an enemy dragon, dealing 6800 to 9200 Fire damage and then jumping to additional dragons within 30 yards. Each jump increases the damage by 50%. Affects up to 5 total targets
- SPELL_RUBY_EVASIVE_AURA = 50248, //Instant - Allows the Ruby Drake to generate Evasive Charges when hit by hostile attacks and spells.
- SPELL_RUBY_EVASIVE_MANEUVERS = 50240, //Instant - 5 sec. cooldown - Allows your drake to dodge all incoming attacks and spells. Requires Evasive Charges to use. Each attack or spell dodged while this ability is active burns one Evasive Charge. Lasts 30 sec. or until all charges are exhausted.
- //you do not have acces to until you kill Mage-Lord Urom
- SPELL_RUBY_MARTYR = 50253, //Instant - 10 sec. cooldown - Redirect all harmful spells cast at friendly drakes to yourself for 10 sec.
-
-/*Amber Drake,
-(npc 27755) (item 37859)
-(summoned by spell Amber Essence = 37859 ---> Call Amber Drake == 49461 ---> Summon 27755)
-*/
- SPELL_RIDE_AMBER_DRAKE_QUE = 49459, //Apply Aura: Periodic Trigger, Interval: 3 seconds ---> 49460
- SPELL_AMBER_DRAKE_SADDLE = 49460, //Allows you to ride on the back of an Amber Drake. ---> Dummy
- SPELL_AMBER_SHOCK_CHARGE = 49836,
- SPELL_AMBER_SHOCK_LANCE = 49840, //(60 yds) - Instant - Deals 4822 to 5602 Arcane damage and detonates all Shock Charges on an enemy dragon. Damage is increased by 6525 for each detonated.
- // SPELL_AMBER_STOP_TIME //Instant - 1 min cooldown - Halts the passage of time, freezing all enemy dragons in place for 10 sec. This attack applies 5 Shock Charges to each affected target.
- //you do not have access to until you kill the Mage-Lord Urom.
- SPELL_AMBER_TEMPORAL_RIFT = 49592, //(60 yds) - Channeled - Channels a temporal rift on an enemy dragon for 10 sec. While trapped in the rift, all damage done to the target is increased by 100%. In addition, for every 15, 000 damage done to a target affected by Temporal Rift, 1 Shock Charge is generated.
-
-/*Emerald Drake,
-(npc 27692) (item 37815),
- (summoned by spell Emerald Essence = 37815 ---> Call Emerald Drake == 49345 ---> Summon 27692)
-*/
- SPELL_RIDE_EMERALD_DRAKE_QUE = 49427, //Apply Aura: Periodic Trigger, Interval: 3 seconds ---> 49346
- SPELL_EMERALD_DRAKE_SADDLE = 49346, //Allows you to ride on the back of an Amber Drake. ---> Dummy
- SPELL_EMERALD_LEECHING_POISON = 50328, //(60 yds) - Instant - Poisons the enemy dragon, leeching 1300 to the caster every 2 sec. for 12 sec. Stacks up to 3 times.
- SPELL_EMERALD_TOUCH_THE_NIGHTMARE = 50341, //(60 yds) - Instant - Consumes 30% of the caster's max health to inflict 25, 000 nature damage to an enemy dragon and reduce the damage it deals by 25% for 30 sec.
+/*
+ * Ruby Drake (27756)
+ * (summoned by spell Ruby Essence (37860) --> Call Amber Drake (49462) --> Summon 27756)
+ */
+ SPELL_RIDE_RUBY_DRAKE_QUE = 49463, // Apply Aura: Periodic Trigger, Interval: 3 seconds --> 49464
+ SPELL_RUBY_DRAKE_SADDLE = 49464, // Allows you to ride on the back of an Amber Drake. --> Dummy
+ SPELL_RUBY_SEARING_WRATH = 50232, // (60 yds) - Instant - Breathes a stream of fire at an enemy dragon, dealing 6800 to 9200 Fire damage and then jumping to additional dragons within 30 yards. Each jump increases the damage by 50%. Affects up to 5 total targets
+ SPELL_RUBY_EVASIVE_AURA = 50248, // Instant - Allows the Ruby Drake to generate Evasive Charges when hit by hostile attacks and spells.
+ SPELL_RUBY_EVASIVE_CHARGES = 50241,
+ SPELL_RUBY_EVASIVE_MANEUVERS = 50240, // Instant - 5 sec. cooldown - Allows your drake to dodge all incoming attacks and spells. Requires Evasive Charges to use. Each attack or spell dodged while this ability is active burns one Evasive Charge. Lasts 30 sec. or until all charges are exhausted.
+ // you do not have acces to until you kill Mage-Lord Urom
+ SPELL_RUBY_MARTYR = 50253, // Instant - 10 sec. cooldown - Redirect all harmful spells cast at friendly drakes to yourself for 10 sec.
+
+/*
+ * Amber Drake (27755)
+ * (summoned by spell Amber Essence (37859) --> Call Amber Drake (49461) --> Summon 27755)
+ */
+ SPELL_RIDE_AMBER_DRAKE_QUE = 49459, // Apply Aura: Periodic Trigger, Interval: 3 seconds --> 49460
+ SPELL_AMBER_DRAKE_SADDLE = 49460, // Allows you to ride on the back of an Amber Drake. --> Dummy
+ SPELL_AMBER_SHOCK_CHARGE = 49836,
+ SPELL_AMBER_SHOCK_LANCE = 49840, // (60 yds) - Instant - Deals 4822 to 5602 Arcane damage and detonates all Shock Charges on an enemy dragon. Damage is increased by 6525 for each detonated.
+ SPELL_AMBER_STOP_TIME = 49838, // Instant - 1 min cooldown - Halts the passage of time, freezing all enemy dragons in place for 10 sec. This attack applies 5 Shock Charges to each affected target.
+ // you do not have access to until you kill the Mage-Lord Urom.
+ SPELL_AMBER_TEMPORAL_RIFT = 49592, // (60 yds) - Channeled - Channels a temporal rift on an enemy dragon for 10 sec. While trapped in the rift, all damage done to the target is increased by 100%. In addition, for every 15, 000 damage done to a target affected by Temporal Rift, 1 Shock Charge is generated.
+
+/*
+ * Emerald Drake (27692)
+ * (summoned by spell Emerald Essence (37815) --> Call Emerald Drake (49345) --> Summon 27692)
+ */
+ SPELL_RIDE_EMERALD_DRAKE_QUE = 49427, // Apply Aura: Periodic Trigger, Interval: 3 seconds --> 49346
+ SPELL_EMERALD_DRAKE_SADDLE = 49346, // Allows you to ride on the back of an Amber Drake. --> Dummy
+ SPELL_EMERALD_LEECHING_POISON = 50328, // (60 yds) - Instant - Poisons the enemy dragon, leeching 1300 to the caster every 2 sec. for 12 sec. Stacks up to 3 times.
+ SPELL_EMERALD_TOUCH_THE_NIGHTMARE = 50341, // (60 yds) - Instant - Consumes 30% of the caster's max health to inflict 25, 000 nature damage to an enemy dragon and reduce the damage it deals by 25% for 30 sec.
// you do not have access to until you kill the Mage-Lord Urom
- SPELL_EMERALD_DREAM_FUNNEL = 50344, //(60 yds) - Channeled - Transfers 5% of the caster's max health to a friendly drake every second for 10 seconds as long as the caster channels.
+ SPELL_EMERALD_DREAM_FUNNEL = 50344, // (60 yds) - Channeled - Transfers 5% of the caster's max health to a friendly drake every second for 10 seconds as long as the caster channels.
// Misc
- POINT_LAND = 2,
- POINT_TAKE_OFF = 3
+ POINT_LAND = 2,
+ POINT_TAKE_OFF = 3
};
enum DrakeEvents
@@ -432,6 +433,85 @@ class spell_oculus_ride_ruby_emerald_amber_drake_que : public SpellScriptLoader
}
};
+// 50240 - Evasive Maneuvers
+class spell_oculus_evasive_maneuvers : public SpellScriptLoader
+{
+ public:
+ spell_oculus_evasive_maneuvers() : SpellScriptLoader("spell_oculus_evasive_maneuvers") { }
+
+ class spell_oculus_evasive_maneuvers_AuraScript : public AuraScript
+ {
+ PrepareAuraScript(spell_oculus_evasive_maneuvers_AuraScript);
+
+ bool Validate(SpellInfo const* /*spellInfo*/) OVERRIDE
+ {
+ if (!sSpellMgr->GetSpellInfo(SPELL_RUBY_EVASIVE_CHARGES))
+ return false;
+ return true;
+ }
+
+ void HandleProc(AuraEffect const* /*aurEff*/, ProcEventInfo& /*eventInfo*/)
+ {
+ PreventDefaultAction();
+ GetTarget()->RemoveAuraFromStack(SPELL_RUBY_EVASIVE_CHARGES);
+ if (!GetTarget()->HasAura(SPELL_RUBY_EVASIVE_CHARGES))
+ Remove();
+ }
+
+ void Register() OVERRIDE
+ {
+ OnEffectProc += AuraEffectProcFn(spell_oculus_evasive_maneuvers_AuraScript::HandleProc, EFFECT_2, SPELL_AURA_PROC_TRIGGER_SPELL);
+ }
+ };
+
+ AuraScript* GetAuraScript() const OVERRIDE
+ {
+ return new spell_oculus_evasive_maneuvers_AuraScript();
+ }
+};
+
+// 49840 - Shock Lance
+class spell_oculus_shock_lance : public SpellScriptLoader
+{
+ public:
+ spell_oculus_shock_lance() : SpellScriptLoader("spell_oculus_shock_lance") { }
+
+ class spell_oculus_shock_lance_SpellScript : public SpellScript
+ {
+ PrepareSpellScript(spell_oculus_shock_lance_SpellScript);
+
+ bool Validate(SpellInfo const* /*spellInfo*/) OVERRIDE
+ {
+ if (!sSpellMgr->GetSpellInfo(SPELL_AMBER_SHOCK_CHARGE))
+ return false;
+ return true;
+ }
+
+ void CalcDamage()
+ {
+ int32 damage = GetHitDamage();
+ if (Unit* target = GetHitUnit())
+ if (AuraEffect const* shockCharges = target->GetAuraEffect(SPELL_AMBER_SHOCK_CHARGE, EFFECT_0, GetCaster()->GetGUID()))
+ {
+ damage += shockCharges->GetAmount();
+ shockCharges->GetBase()->Remove();
+ }
+
+ SetHitDamage(damage);
+ }
+
+ void Register() OVERRIDE
+ {
+ OnHit += SpellHitFn(spell_oculus_shock_lance_SpellScript::CalcDamage);
+ }
+ };
+
+ SpellScript* GetSpellScript() const OVERRIDE
+ {
+ return new spell_oculus_shock_lance_SpellScript();
+ }
+};
+
// 49838 - Stop Time
class spell_oculus_stop_time : public SpellScriptLoader
{
@@ -457,7 +537,7 @@ class spell_oculus_stop_time : public SpellScriptLoader
Unit* target = GetTarget();
for (uint32 i = 0; i < 5; ++i)
- caster->CastSpell(target, SPELL_AMBER_SHOCK_CHARGE, false);
+ caster->CastSpell(target, SPELL_AMBER_SHOCK_CHARGE, true);
}
void Register() OVERRIDE
@@ -472,6 +552,51 @@ class spell_oculus_stop_time : public SpellScriptLoader
}
};
+// 49592 - Temporal Rift
+class spell_oculus_temporal_rift : public SpellScriptLoader
+{
+ public:
+ spell_oculus_temporal_rift() : SpellScriptLoader("spell_oculus_temporal_rift") { }
+
+ class spell_oculus_temporal_rift_AuraScript : public AuraScript
+ {
+ PrepareAuraScript(spell_oculus_temporal_rift_AuraScript);
+
+ bool Validate(SpellInfo const* /*spellInfo*/) OVERRIDE
+ {
+ if (!sSpellMgr->GetSpellInfo(SPELL_AMBER_SHOCK_CHARGE))
+ return false;
+ return true;
+ }
+
+ void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo)
+ {
+ PreventDefaultAction();
+ int32 amount = aurEff->GetAmount() + eventInfo.GetDamageInfo()->GetDamage();
+
+ if (amount >= 15000)
+ {
+ if (Unit* caster = GetCaster())
+ caster->CastSpell(GetTarget(), SPELL_AMBER_SHOCK_CHARGE, true);
+ amount -= 15000;
+ }
+
+ const_cast<AuraEffect*>(aurEff)->SetAmount(amount);
+ }
+
+ void Register() OVERRIDE
+ {
+ OnEffectProc += AuraEffectProcFn(spell_oculus_temporal_rift_AuraScript::HandleProc, EFFECT_2, SPELL_AURA_DUMMY);
+ }
+ };
+
+ AuraScript* GetAuraScript() const OVERRIDE
+ {
+ return new spell_oculus_temporal_rift_AuraScript();
+ }
+};
+
+// 50341 - Touch the Nightmare
class spell_oculus_touch_the_nightmare : public SpellScriptLoader
{
public:
@@ -498,7 +623,8 @@ class spell_oculus_touch_the_nightmare : public SpellScriptLoader
}
};
-class spell_oculus_dream_funnel: public SpellScriptLoader
+// 50344 - Dream Funnel
+class spell_oculus_dream_funnel : public SpellScriptLoader
{
public:
spell_oculus_dream_funnel() : SpellScriptLoader("spell_oculus_dream_funnel") { }
@@ -535,7 +661,10 @@ void AddSC_oculus()
new npc_ruby_emerald_amber_drake();
new spell_oculus_call_ruby_emerald_amber_drake();
new spell_oculus_ride_ruby_emerald_amber_drake_que();
+ new spell_oculus_evasive_maneuvers();
+ new spell_oculus_shock_lance();
new spell_oculus_stop_time();
+ new spell_oculus_temporal_rift();
new spell_oculus_touch_the_nightmare();
new spell_oculus_dream_funnel();
}
diff --git a/src/server/scripts/Northrend/zone_grizzly_hills.cpp b/src/server/scripts/Northrend/zone_grizzly_hills.cpp
index 9ea3023de01..6587f0536b3 100644
--- a/src/server/scripts/Northrend/zone_grizzly_hills.cpp
+++ b/src/server/scripts/Northrend/zone_grizzly_hills.cpp
@@ -20,7 +20,9 @@
#include "ScriptedCreature.h"
#include "ScriptedEscortAI.h"
#include "Player.h"
+#include "Spell.h"
#include "SpellInfo.h"
+#include "SpellScript.h"
#include "CreatureTextMgr.h"
/*######
@@ -749,6 +751,43 @@ public:
}
};
+enum ShredderDelivery
+{
+ NPC_BROKEN_DOWN_SHREDDER = 27354
+};
+
+class spell_shredder_delivery : public SpellScriptLoader
+{
+ public:
+ spell_shredder_delivery() : SpellScriptLoader("spell_shredder_delivery") { }
+
+ class spell_shredder_delivery_SpellScript : public SpellScript
+ {
+ PrepareSpellScript(spell_shredder_delivery_SpellScript);
+
+ bool Load() OVERRIDE
+ {
+ return GetCaster()->GetTypeId() == TYPEID_UNIT;
+ }
+
+ void HandleScript(SpellEffIndex /*effIndex*/)
+ {
+ if (GetCaster()->ToCreature()->GetEntry() == NPC_BROKEN_DOWN_SHREDDER)
+ GetCaster()->ToCreature()->DespawnOrUnsummon();
+ }
+
+ void Register() OVERRIDE
+ {
+ OnEffectHitTarget += SpellEffectFn(spell_shredder_delivery_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT);
+ }
+ };
+
+ SpellScript* GetSpellScript() const OVERRIDE
+ {
+ return new spell_shredder_delivery_SpellScript();
+ }
+};
+
void AddSC_grizzly_hills()
{
new npc_emily();
@@ -759,4 +798,5 @@ void AddSC_grizzly_hills()
new npc_wounded_skirmisher();
new npc_venture_co_straggler();
new npc_lake_frog();
+ new spell_shredder_delivery();
}
diff --git a/src/server/scripts/Northrend/zone_howling_fjord.cpp b/src/server/scripts/Northrend/zone_howling_fjord.cpp
index 671628e4cbc..fd5b0a5ca1c 100644
--- a/src/server/scripts/Northrend/zone_howling_fjord.cpp
+++ b/src/server/scripts/Northrend/zone_howling_fjord.cpp
@@ -32,6 +32,8 @@ EndContentData */
#include "ScriptedGossip.h"
#include "ScriptedEscortAI.h"
#include "Player.h"
+#include "SpellInfo.h"
+#include "SpellScript.h"
/*######
## npc_apothecary_hanes
@@ -43,7 +45,8 @@ enum Entries
FACTION_ESCORTEE_H = 775,
NPC_HANES_FIRE_TRIGGER = 23968,
QUEST_TRAIL_OF_FIRE = 11241,
- SPELL_COSMETIC_LOW_POLY_FIRE = 56274
+ SPELL_COSMETIC_LOW_POLY_FIRE = 56274,
+ SPELL_HEALING_POTION = 17534
};
class npc_apothecary_hanes : public CreatureScript
@@ -92,7 +95,7 @@ public:
{
if (PotTimer <= diff)
{
- DoCast(me, 17534, true);
+ DoCast(me, SPELL_HEALING_POTION, true);
PotTimer = 10000;
} else PotTimer -= diff;
}
@@ -380,10 +383,107 @@ public:
}
};
+enum MindlessAbomination
+{
+ EVENT_CHECK_CHARMED = 1
+};
+
+class npc_mindless_abomination : public CreatureScript
+{
+public:
+ npc_mindless_abomination() : CreatureScript("npc_mindless_abomination") { }
+
+ struct npc_mindless_abominationAI : public ScriptedAI
+ {
+ npc_mindless_abominationAI(Creature* creature) : ScriptedAI(creature) { }
+
+ void Reset() OVERRIDE
+ {
+ events.ScheduleEvent(EVENT_CHECK_CHARMED, 1000);
+ }
+
+ void UpdateAI(uint32 diff) OVERRIDE
+ {
+ events.Update(diff);
+
+ while (uint32 eventId = events.ExecuteEvent())
+ {
+ switch (eventId)
+ {
+ case EVENT_CHECK_CHARMED:
+ if (!me->IsCharmedOwnedByPlayerOrPlayer())
+ me->DespawnOrUnsummon();
+ else
+ events.ScheduleEvent(EVENT_CHECK_CHARMED, 1000);
+ break;
+ }
+ }
+ }
+
+ private:
+ EventMap events;
+ };
+
+ CreatureAI* GetAI(Creature* creature) const OVERRIDE
+ {
+ return new npc_mindless_abominationAI(creature);
+ }
+};
+
+class spell_mindless_abomination_explosion_fx_master : public SpellScriptLoader
+{
+ enum Spells
+ {
+ SPELL_RANDOM_CIRCUMFERENCE_POINT_POISON = 42266,
+ SPELL_COSMETIC_BLOOD_EXPLOSION_GREEN_LARGE = 43401
+ };
+
+ public:
+ spell_mindless_abomination_explosion_fx_master() : SpellScriptLoader("spell_mindless_abomination_explosion_fx_master") { }
+
+ class spell_mindless_abomination_explosion_fx_master_SpellScript : public SpellScript
+ {
+ PrepareSpellScript(spell_mindless_abomination_explosion_fx_master_SpellScript);
+
+ bool Validate(SpellInfo const* /*spellInfo*/) OVERRIDE
+ {
+ if (!sSpellMgr->GetSpellInfo(SPELL_RANDOM_CIRCUMFERENCE_POINT_POISON) || !sSpellMgr->GetSpellInfo(SPELL_COSMETIC_BLOOD_EXPLOSION_GREEN_LARGE))
+ return false;
+ return true;
+ }
+
+ void HandleScript(SpellEffIndex /*eff*/)
+ {
+ Creature* caster = GetCaster()->ToCreature();
+ if (!caster)
+ return;
+
+ caster->AI()->DoCast(caster, SPELL_COSMETIC_BLOOD_EXPLOSION_GREEN_LARGE);
+
+ for (uint8 i = 0; i < 10; ++i)
+ caster->AI()->DoCast(caster, SPELL_RANDOM_CIRCUMFERENCE_POINT_POISON);
+
+ caster->DespawnOrUnsummon(4000);
+ }
+
+ void Register() OVERRIDE
+ {
+ OnEffectHitTarget += SpellEffectFn(spell_mindless_abomination_explosion_fx_master_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT);
+ }
+ };
+
+ SpellScript* GetSpellScript() const OVERRIDE
+ {
+ return new spell_mindless_abomination_explosion_fx_master_SpellScript();
+ }
+};
+
void AddSC_howling_fjord()
{
- new npc_apothecary_hanes;
- new npc_plaguehound_tracker;
- new npc_razael_and_lyana;
- new npc_daegarn;
+ new npc_apothecary_hanes();
+ new npc_plaguehound_tracker();
+ new npc_razael_and_lyana();
+ new npc_daegarn();
+ new npc_mindless_abomination();
+ new spell_mindless_abomination_explosion_fx_master();
}
diff --git a/src/server/scripts/Northrend/zone_icecrown.cpp b/src/server/scripts/Northrend/zone_icecrown.cpp
index b20efa1c5a5..5c65be982e0 100644
--- a/src/server/scripts/Northrend/zone_icecrown.cpp
+++ b/src/server/scripts/Northrend/zone_icecrown.cpp
@@ -25,91 +25,6 @@
#include "CombatAI.h"
/*######
-## npc_arete
-######*/
-
-#define GOSSIP_ARETE_ITEM1 "Lord-Commander, I would hear your tale."
-#define GOSSIP_ARETE_ITEM2 "<You nod slightly but do not complete the motion as the Lord-Commander narrows his eyes before he continues.>"
-#define GOSSIP_ARETE_ITEM3 "I thought that they now called themselves the Scarlet Onslaught?"
-#define GOSSIP_ARETE_ITEM4 "Where did the grand admiral go?"
-#define GOSSIP_ARETE_ITEM5 "That's fine. When do I start?"
-#define GOSSIP_ARETE_ITEM6 "Let's finish this!"
-#define GOSSIP_ARETE_ITEM7 "That's quite a tale, Lord-Commander."
-
-enum Arete
-{
- GOSSIP_TEXTID_ARETE1 = 13525,
- GOSSIP_TEXTID_ARETE2 = 13526,
- GOSSIP_TEXTID_ARETE3 = 13527,
- GOSSIP_TEXTID_ARETE4 = 13528,
- GOSSIP_TEXTID_ARETE5 = 13529,
- GOSSIP_TEXTID_ARETE6 = 13530,
- GOSSIP_TEXTID_ARETE7 = 13531,
-
- QUEST_THE_STORY_THUS_FAR = 12807
-};
-
-class npc_arete : public CreatureScript
-{
-public:
- npc_arete() : CreatureScript("npc_arete") { }
-
- bool OnGossipHello(Player* player, Creature* creature) OVERRIDE
- {
- if (creature->IsQuestGiver())
- player->PrepareQuestMenu(creature->GetGUID());
-
- if (player->GetQuestStatus(QUEST_THE_STORY_THUS_FAR) == QUEST_STATUS_INCOMPLETE)
- {
- player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_ARETE_ITEM1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1);
- player->SEND_GOSSIP_MENU(GOSSIP_TEXTID_ARETE1, creature->GetGUID());
- return true;
- }
-
- player->SEND_GOSSIP_MENU(player->GetGossipTextId(creature), creature->GetGUID());
- return true;
- }
-
- bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) OVERRIDE
- {
- player->PlayerTalkClass->ClearMenus();
- switch (action)
- {
- case GOSSIP_ACTION_INFO_DEF+1:
- player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_ARETE_ITEM2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2);
- player->SEND_GOSSIP_MENU(GOSSIP_TEXTID_ARETE2, creature->GetGUID());
- break;
- case GOSSIP_ACTION_INFO_DEF+2:
- player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_ARETE_ITEM3, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 3);
- player->SEND_GOSSIP_MENU(GOSSIP_TEXTID_ARETE3, creature->GetGUID());
- break;
- case GOSSIP_ACTION_INFO_DEF+3:
- player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_ARETE_ITEM4, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 4);
- player->SEND_GOSSIP_MENU(GOSSIP_TEXTID_ARETE4, creature->GetGUID());
- break;
- case GOSSIP_ACTION_INFO_DEF+4:
- player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_ARETE_ITEM5, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 5);
- player->SEND_GOSSIP_MENU(GOSSIP_TEXTID_ARETE5, creature->GetGUID());
- break;
- case GOSSIP_ACTION_INFO_DEF+5:
- player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_ARETE_ITEM6, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 6);
- player->SEND_GOSSIP_MENU(GOSSIP_TEXTID_ARETE6, creature->GetGUID());
- break;
- case GOSSIP_ACTION_INFO_DEF+6:
- player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_ARETE_ITEM7, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 7);
- player->SEND_GOSSIP_MENU(GOSSIP_TEXTID_ARETE7, creature->GetGUID());
- break;
- case GOSSIP_ACTION_INFO_DEF+7:
- player->CLOSE_GOSSIP_MENU();
- player->AreaExploredOrEventHappens(QUEST_THE_STORY_THUS_FAR);
- break;
- }
-
- return true;
- }
-};
-
-/*######
## npc_squire_david
######*/
@@ -1149,7 +1064,6 @@ class npc_morbidus : public CreatureScript
void AddSC_icecrown()
{
- new npc_arete;
new npc_squire_david;
new npc_argent_valiant;
new npc_guardian_pavilion;
diff --git a/src/server/scripts/Northrend/zone_sholazar_basin.cpp b/src/server/scripts/Northrend/zone_sholazar_basin.cpp
index 77b85037a01..a0b6524bd89 100644
--- a/src/server/scripts/Northrend/zone_sholazar_basin.cpp
+++ b/src/server/scripts/Northrend/zone_sholazar_basin.cpp
@@ -1082,6 +1082,57 @@ public:
}
};
+/*######
+## Quest Dreadsaber Mastery: Stalking the Prey (12550)
+######*/
+
+enum ShangoTracks
+{
+ SPELL_CORRECT_TRACKS = 52160,
+ SPELL_INCORRECT_TRACKS = 52163,
+ SAY_CORRECT_TRACKS = 28634,
+ SAY_INCORRECT_TRACKS = 28635
+};
+
+class spell_shango_tracks : public SpellScriptLoader
+{
+public:
+ spell_shango_tracks() : SpellScriptLoader("spell_shango_tracks") { }
+
+ class spell_shango_tracks_SpellScript : public SpellScript
+ {
+ PrepareSpellScript(spell_shango_tracks_SpellScript);
+
+ void HandleScript(SpellEffIndex /*effIndex*/)
+ {
+ if (Player* player = GetHitUnit()->ToPlayer())
+ {
+ switch (GetSpellInfo()->Id)
+ {
+ case SPELL_CORRECT_TRACKS:
+ player->MonsterSay(sObjectMgr->GetTrinityStringForDBCLocale(SAY_CORRECT_TRACKS), LANG_UNIVERSAL, player->GetGUID());
+ break;
+ case SPELL_INCORRECT_TRACKS:
+ player->MonsterSay(sObjectMgr->GetTrinityStringForDBCLocale(SAY_INCORRECT_TRACKS), LANG_UNIVERSAL, player->GetGUID());
+ break;
+ default:
+ break;
+ }
+ }
+ }
+
+ void Register() OVERRIDE
+ {
+ OnEffectHitTarget += SpellEffectFn(spell_shango_tracks_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT);
+ }
+ };
+
+ SpellScript* GetSpellScript() const OVERRIDE
+ {
+ return new spell_shango_tracks_SpellScript();
+ }
+};
+
void AddSC_sholazar_basin()
{
new npc_injured_rainspeaker_oracle();
@@ -1095,4 +1146,5 @@ void AddSC_sholazar_basin()
new spell_q12589_shoot_rjr();
new npc_haiphoon();
new npc_vics_flying_machine();
+ new spell_shango_tracks();
}
diff --git a/src/server/scripts/Northrend/zone_storm_peaks.cpp b/src/server/scripts/Northrend/zone_storm_peaks.cpp
index 825981ba5c5..d08c60d373d 100644
--- a/src/server/scripts/Northrend/zone_storm_peaks.cpp
+++ b/src/server/scripts/Northrend/zone_storm_peaks.cpp
@@ -413,6 +413,181 @@ class npc_hyldsmeet_protodrake : public CreatureScript
}
};
+
+/*#####
+# npc_brann_bronzebeard for Quest 13285 "Forging the Keystone"
+#####*/
+
+enum BrannBronzebeard
+{
+ NPC_BRANN_BRONZEBEARD = 31810,
+ NPC_A_DISTANT_VOICE = 31814,
+ OBJECT_TOL_SIGNAL_1 = 193590,
+ OBJECT_TOL_SIGNAL_2 = 193591,
+ OBJECT_TOL_SIGNAL_3 = 193592,
+ OBJECT_TOL_SIGNAL_4 = 193593,
+ OBJECT_TOL_SIGNAL_5 = 193594,
+ SPELL_RESURRECTION = 58854,
+ SAY_BRANN_1 = 0,
+ SAY_BRANN_2 = 1,
+ SAY_BRANN_3 = 2,
+ SAY_VOICE_1 = 0,
+ SAY_VOICE_2 = 1,
+ SAY_VOICE_3 = 2,
+ SAY_VOICE_4 = 3,
+ SAY_VOICE_5 = 4,
+
+ EVENT_SCRIPT_1 = 1,
+ EVENT_SCRIPT_2 = 2,
+ EVENT_SCRIPT_3 = 3,
+ EVENT_SCRIPT_4 = 4,
+ EVENT_SCRIPT_5 = 5,
+ EVENT_SCRIPT_6 = 6,
+ EVENT_SCRIPT_7 = 7,
+ EVENT_SCRIPT_8 = 8,
+ EVENT_SCRIPT_9 = 9,
+ EVENT_SCRIPT_10 = 10,
+ EVENT_SCRIPT_11 = 11,
+ EVENT_SCRIPT_12 = 12,
+ EVENT_SCRIPT_13 = 13
+};
+
+class npc_brann_bronzebeard_keystone : public CreatureScript
+{
+public:
+ npc_brann_bronzebeard_keystone() : CreatureScript("npc_brann_bronzebeard_keystone") { }
+
+ struct npc_brann_bronzebeard_keystoneAI : public ScriptedAI
+ {
+ npc_brann_bronzebeard_keystoneAI(Creature* creature) : ScriptedAI(creature) { }
+
+ void Reset() OVERRIDE
+ {
+ memset(&objectGUID, 0, sizeof(objectGUID));
+ playerGUID = 0;
+ voiceGUID = 0;
+ objectCounter = 0;
+ }
+
+ void sGossipSelect(Player* player, uint32 /*sender*/, uint32 /*action*/) OVERRIDE
+ {
+ player->CLOSE_GOSSIP_MENU();
+ playerGUID = player->GetGUID();
+ events.ScheduleEvent(EVENT_SCRIPT_1, 100);
+ }
+
+ void UpdateAI(uint32 diff) OVERRIDE
+ {
+ events.Update(diff);
+
+ while (uint32 eventId = events.ExecuteEvent())
+ {
+ switch (eventId)
+ {
+ case EVENT_SCRIPT_1:
+ Talk(SAY_BRANN_1, playerGUID);
+ me->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP | UNIT_NPC_FLAG_QUESTGIVER);
+ if (Creature* voice = me->SummonCreature(NPC_A_DISTANT_VOICE, 7863.43f, -1396.585f, 1538.076f, 2.949606f, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 49000))
+ voiceGUID = voice->GetGUID();
+ events.ScheduleEvent(EVENT_SCRIPT_2, 4000);
+ break;
+ case EVENT_SCRIPT_2:
+ me->SetWalk(true);
+ me->GetMotionMaster()->MovePoint(0, 7861.488f, -1396.376f, 1534.059f, false);
+ events.ScheduleEvent(EVENT_SCRIPT_3, 6000);
+ break;
+ case EVENT_SCRIPT_3:
+ me->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_STATE_WORK_MINING);
+ events.ScheduleEvent(EVENT_SCRIPT_4, 6000);
+ break;
+ case EVENT_SCRIPT_4:
+ me->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_ONESHOT_NONE);
+ if (Creature* voice = ObjectAccessor::GetCreature(*me, voiceGUID))
+ {
+ voice->AI()->DoCast(voice, SPELL_RESURRECTION);
+ voice->AI()->Talk(SAY_VOICE_1, playerGUID);
+ }
+ if (GameObject* go = me->SummonGameObject(OBJECT_TOL_SIGNAL_1, 7860.273f, -1383.622f, 1538.302f, -1.658062f, 0, 0, -0.737277f, 0.6755905f, 0))
+ objectGUID[objectCounter++] = go->GetGUID();
+ events.ScheduleEvent(EVENT_SCRIPT_5, 6000);
+ break;
+ case EVENT_SCRIPT_5:
+ if (Creature* voice = ObjectAccessor::GetCreature(*me, voiceGUID))
+ voice->AI()->Talk(SAY_VOICE_2, playerGUID);
+ if (GameObject* go = me->SummonGameObject(OBJECT_TOL_SIGNAL_2, 7875.67f, -1387.266f, 1538.323f, -2.373644f, 0, 0, -0.9271832f, 0.3746083f, 0))
+ objectGUID[objectCounter++] = go->GetGUID();
+ events.ScheduleEvent(EVENT_SCRIPT_6, 6000);
+ break;
+ case EVENT_SCRIPT_6:
+ if (Creature* voice = ObjectAccessor::GetCreature(*me, voiceGUID))
+ voice->AI()->Talk(SAY_VOICE_3, playerGUID);
+ if (GameObject* go = me->SummonGameObject(OBJECT_TOL_SIGNAL_3, 7879.212f, -1401.175f, 1538.279f, 2.967041f, 0, 0, 0.9961939f, 0.08716504f, 0))
+ objectGUID[objectCounter++] = go->GetGUID();
+ events.ScheduleEvent(EVENT_SCRIPT_7, 6000);
+ break;
+ case EVENT_SCRIPT_7:
+ if (Creature* voice = ObjectAccessor::GetCreature(*me, voiceGUID))
+ voice->AI()->Talk(SAY_VOICE_4, playerGUID);
+ if (GameObject* go = me->SummonGameObject(OBJECT_TOL_SIGNAL_4, 7868.944f, -1411.18f, 1538.213f, 2.111848f, 0, 0, 0.8703556f, 0.4924237f, 0))
+ objectGUID[objectCounter++] = go->GetGUID();
+ events.ScheduleEvent(EVENT_SCRIPT_8, 6000);
+ break;
+ case EVENT_SCRIPT_8:
+ if (Creature* voice = ObjectAccessor::GetCreature(*me, voiceGUID))
+ voice->AI()->Talk(SAY_VOICE_5, playerGUID);
+ if (GameObject* go = me->SummonGameObject(OBJECT_TOL_SIGNAL_5, 7855.11f, -1406.839f, 1538.42f, 1.151916f, 0, 0, 0.5446386f, 0.8386708f, 0))
+ objectGUID[objectCounter] = go->GetGUID();
+ events.ScheduleEvent(EVENT_SCRIPT_9, 6000);
+ break;
+ case EVENT_SCRIPT_9:
+ if (Creature* voice = ObjectAccessor::GetCreature(*me, voiceGUID))
+ voice->AI()->DoCast(voice, SPELL_RESURRECTION);
+ events.ScheduleEvent(EVENT_SCRIPT_10, 6000);
+ break;
+ case EVENT_SCRIPT_10:
+ Talk(SAY_BRANN_2, playerGUID);
+ if (Player* player = ObjectAccessor::GetPlayer(*me, playerGUID))
+ player->KilledMonsterCredit(me->GetEntry());
+ events.ScheduleEvent(EVENT_SCRIPT_11, 6000);
+ break;
+ case EVENT_SCRIPT_11:
+ me->SetOrientation(2.932153f);
+ me->SendMovementFlagUpdate(true);
+ Talk(SAY_BRANN_3, playerGUID);
+ for (uint8 i = 0; i < 5; ++i)
+ {
+ if (GameObject* go = ObjectAccessor::GetGameObject(*me, objectGUID[i]))
+ go->Delete();
+ }
+ events.ScheduleEvent(EVENT_SCRIPT_12, 6000);
+ break;
+ case EVENT_SCRIPT_12:
+ me->GetMotionMaster()->Clear();
+ me->SetWalk(false);
+ me->GetMotionMaster()->MovePoint(0, 7799.908f, -1413.561f, 1534.829f, false);
+ events.ScheduleEvent(EVENT_SCRIPT_13, 10000);
+ break;
+ case EVENT_SCRIPT_13:
+ me->DisappearAndDie();
+ break;
+ }
+ }
+ }
+
+ private:
+ EventMap events;
+ uint64 playerGUID;
+ uint64 objectGUID[5];
+ uint64 voiceGUID;
+ uint8 objectCounter;
+ };
+
+ CreatureAI* GetAI(Creature* creature) const OVERRIDE
+ {
+ return new npc_brann_bronzebeard_keystoneAI(creature);
+ }
+};
+
enum CloseRift
{
SPELL_DESPAWN_RIFT = 61665
@@ -467,7 +642,11 @@ class spell_close_rift : public SpellScriptLoader
enum JokkumScriptcast
{
SPELL_JOKKUM_KILL_CREDIT = 56545,
- SPELL_JOKKUM_SUMMON = 56541
+ SPELL_JOKKUM_SUMMON = 56541,
+ SPELL_RIDE_JOKKUM = 56606,
+ NPC_KINGJOKKUM = 30331,
+ SAY_HOLD_ON = 0,
+ PATH_JOKKUM = 2072200
};
class spell_jokkum_scriptcast : public SpellScriptLoader
@@ -491,6 +670,17 @@ class spell_jokkum_scriptcast : public SpellScriptLoader
{
player->CastSpell(player, SPELL_JOKKUM_KILL_CREDIT, true);
player->CastSpell(player, SPELL_JOKKUM_SUMMON, true);
+
+ if (Creature* kingjokkum = GetClosestCreatureWithEntry(player, NPC_KINGJOKKUM, 10.0f))
+ {
+ kingjokkum->setFaction(player->getFaction());
+ player->CastSpell(kingjokkum, SPELL_RIDE_JOKKUM, true);
+ player->SetUInt64Value(PLAYER_FARSIGHT, player->GetGUID());
+ kingjokkum->AI()->Talk(0, player->GetGUID());
+ kingjokkum->ToPlayer()->SetClientControl(kingjokkum, 1);
+ kingjokkum->GetMotionMaster()->MovePath(PATH_JOKKUM, false);
+ kingjokkum->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_NPC);
+ }
}
}
@@ -514,6 +704,7 @@ void AddSC_storm_peaks()
new npc_freed_protodrake();
new npc_icefang();
new npc_hyldsmeet_protodrake();
+ new npc_brann_bronzebeard_keystone();
new spell_close_rift();
new spell_jokkum_scriptcast();
}
diff --git a/src/server/scripts/Northrend/zone_zuldrak.cpp b/src/server/scripts/Northrend/zone_zuldrak.cpp
index 29d7c017748..1137c86f287 100644
--- a/src/server/scripts/Northrend/zone_zuldrak.cpp
+++ b/src/server/scripts/Northrend/zone_zuldrak.cpp
@@ -57,16 +57,15 @@ public:
float x, y, z;
me->GetClosePoint(x, y, z, me->GetObjectSize() / 3, 0.1f);
- if (Unit* summon = me->SummonCreature(NPC_RAGECLAW, x, y, z, 0, TEMPSUMMON_DEAD_DESPAWN, 1000))
+ if (Creature* summon = me->SummonCreature(NPC_RAGECLAW, x, y, z, 0, TEMPSUMMON_DEAD_DESPAWN, 1000))
{
_rageclawGUID = summon->GetGUID();
- LockRageclaw();
+ LockRageclaw(summon);
}
}
- void LockRageclaw()
+ void LockRageclaw(Creature* rageclaw)
{
- Unit* rageclaw = Unit::GetCreature(*me, _rageclawGUID);
// pointer check not needed
me->SetInFront(rageclaw);
rageclaw->SetInFront(me);
@@ -75,12 +74,11 @@ public:
DoCast(rageclaw, SPELL_RIGHT_CHAIN, true);
}
- void UnlockRageclaw(Unit* who)
+ void UnlockRageclaw(Unit* who, Creature* rageclaw)
{
if (!who)
return;
- Creature* rageclaw = Unit::GetCreature(*me, _rageclawGUID);
// pointer check not needed
DoCast(rageclaw, SPELL_FREE_RAGECLAW, true);
@@ -95,7 +93,7 @@ public:
{
if (Creature* rageclaw = Unit::GetCreature(*me, _rageclawGUID))
{
- UnlockRageclaw(caster);
+ UnlockRageclaw(caster, rageclaw);
caster->ToPlayer()->KilledMonster(rageclaw->GetCreatureTemplate(), _rageclawGUID);
me->DespawnOrUnsummon();
}
@@ -459,6 +457,8 @@ public:
void Reset() OVERRIDE
{
+ _playerGUID = 0;
+ _getingredienttry = 0;
_events.ScheduleEvent(EVENT_TURN_TO_POT, urand(15000, 26000));
}
diff --git a/src/server/scripts/Outland/Auchindoun/AuchenaiCrypts/boss_exarch_maladaar.cpp b/src/server/scripts/Outland/Auchindoun/AuchenaiCrypts/boss_exarch_maladaar.cpp
index 4f7ac113547..783e7b9f09b 100644
--- a/src/server/scripts/Outland/Auchindoun/AuchenaiCrypts/boss_exarch_maladaar.cpp
+++ b/src/server/scripts/Outland/Auchindoun/AuchenaiCrypts/boss_exarch_maladaar.cpp
@@ -68,6 +68,7 @@ public:
void Reset() OVERRIDE
{
+ myClass = CLASS_NONE;
Class_Timer = 1000;
}
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
index b5947e93216..36377b4d715 100644
--- a/src/server/scripts/Outland/TempestKeep/arcatraz/boss_dalliah_the_doomsayer.cpp
+++ b/src/server/scripts/Outland/TempestKeep/arcatraz/boss_dalliah_the_doomsayer.cpp
@@ -72,7 +72,7 @@ class boss_dalliah_the_doomsayer : public CreatureScript
_JustDied();
Talk(SAY_DEATH);
- if (Creature* soccothrates = ObjectAccessor::GetCreature(*me, soccothratesGUID))
+ if (Creature* soccothrates = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_SOCCOTHRATES)))
if (soccothrates->IsAlive() && !soccothrates->IsInCombat())
soccothrates->AI()->SetData(1, 1);
}
@@ -86,9 +86,6 @@ class boss_dalliah_the_doomsayer : public CreatureScript
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
@@ -161,7 +158,7 @@ class boss_dalliah_the_doomsayer : public CreatureScript
events.ScheduleEvent(EVENT_SHADOW_WAVE, urand(11000, 16000));
break;
case EVENT_ME_FIRST:
- if (Creature* soccothrates = ObjectAccessor::GetCreature(*me, soccothratesGUID))
+ if (Creature* soccothrates = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_SOCCOTHRATES)))
if (soccothrates->IsAlive() && !soccothrates->IsInCombat())
soccothrates->AI()->Talk(SAY_AGGRO_DALLIAH_FIRST);
break;
@@ -172,7 +169,7 @@ class boss_dalliah_the_doomsayer : public CreatureScript
if (HealthBelowPct(25) && !soccothratesTaunt)
{
- if (Creature* soccothrates = ObjectAccessor::GetCreature(*me, soccothratesGUID))
+ if (Creature* soccothrates = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_SOCCOTHRATES)))
soccothrates->AI()->Talk(SAY_DALLIAH_25_PERCENT);
soccothratesTaunt = true;
}
@@ -180,15 +177,14 @@ class boss_dalliah_the_doomsayer : public CreatureScript
DoMeleeAttackIfReady();
}
- private:
- bool soccothratesTaunt;
- bool soccothratesDeath;
- uint64 soccothratesGUID;
+ private:
+ bool soccothratesTaunt;
+ bool soccothratesDeath;
};
CreatureAI* GetAI(Creature* creature) const OVERRIDE
{
- return new boss_dalliah_the_doomsayerAI(creature);
+ return GetArcatrazAI<boss_dalliah_the_doomsayerAI>(creature);
}
};
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
index 046ef93bf10..2d9bfc92583 100644
--- a/src/server/scripts/Outland/TempestKeep/arcatraz/boss_wrath_scryer_soccothrates.cpp
+++ b/src/server/scripts/Outland/TempestKeep/arcatraz/boss_wrath_scryer_soccothrates.cpp
@@ -98,7 +98,7 @@ class boss_wrath_scryer_soccothrates : public CreatureScript
_JustDied();
Talk(SAY_DEATH);
- if (Creature* dalliah = ObjectAccessor::GetCreature(*me, dalliahGUID))
+ if (Creature* dalliah = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_DALLIAH)))
if (dalliah->IsAlive() && !dalliah->IsInCombat())
dalliah->AI()->SetData(1, 1);
}
@@ -120,20 +120,13 @@ class boss_wrath_scryer_soccothrates : public CreatureScript
void MoveInLineOfSight(Unit* who) OVERRIDE
{
- if (instance)
+ if (instance->GetData(DATA_CONVERSATION) == NOT_STARTED && who->GetTypeId() == TYPEID_PLAYER && me->IsWithinDistInMap(who, 70.0f))
{
- 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);
+ 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);
- }
- }
+ preFight = true;
+ events.ScheduleEvent(EVENT_PREFIGHT_1, 2000);
}
}
@@ -163,7 +156,7 @@ class boss_wrath_scryer_soccothrates : public CreatureScript
switch (eventId)
{
case EVENT_PREFIGHT_1:
- if (Creature* dalliah = ObjectAccessor::GetCreature(*me, dalliahGUID))
+ if (Creature* dalliah = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_DALLIAH)))
dalliah->AI()->Talk(SAY_DALLIAH_CONVO_1);
events.ScheduleEvent(EVENT_PREFIGHT_2, 3000);
break;
@@ -172,7 +165,7 @@ class boss_wrath_scryer_soccothrates : public CreatureScript
events.ScheduleEvent(EVENT_PREFIGHT_3, 3000);
break;
case EVENT_PREFIGHT_3:
- if (Creature* dalliah = ObjectAccessor::GetCreature(*me, dalliahGUID))
+ if (Creature* dalliah = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_DALLIAH)))
dalliah->AI()->Talk(SAY_DALLIAH_CONVO_2);
events.ScheduleEvent(EVENT_PREFIGHT_4, 6000);
break;
@@ -181,7 +174,7 @@ class boss_wrath_scryer_soccothrates : public CreatureScript
events.ScheduleEvent(EVENT_PREFIGHT_5, 2000);
break;
case EVENT_PREFIGHT_5:
- if (Creature* dalliah = ObjectAccessor::GetCreature(*me, dalliahGUID))
+ if (Creature* dalliah = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_DALLIAH)))
dalliah->AI()->Talk(SAY_DALLIAH_CONVO_3);
events.ScheduleEvent(EVENT_PREFIGHT_6, 3000);
break;
@@ -190,7 +183,7 @@ class boss_wrath_scryer_soccothrates : public CreatureScript
events.ScheduleEvent(EVENT_PREFIGHT_7, 2000);
break;
case EVENT_PREFIGHT_7:
- if (Creature* dalliah = ObjectAccessor::GetCreature(*me, dalliahGUID))
+ if (Creature* dalliah = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_DALLIAH)))
dalliah->GetMotionMaster()->MovePoint(0, 118.6048f, 96.84852f, 22.44115f);
events.ScheduleEvent(EVENT_PREFIGHT_8, 4000);
break;
@@ -199,7 +192,7 @@ class boss_wrath_scryer_soccothrates : public CreatureScript
events.ScheduleEvent(EVENT_PREFIGHT_9, 4000);
break;
case EVENT_PREFIGHT_9:
- if (Creature* dalliah = ObjectAccessor::GetCreature(*me, dalliahGUID))
+ if (Creature* dalliah = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_DALLIAH)))
{
dalliah->SetFacingToObject(me);
me->SetFacingToObject(dalliah);
@@ -253,7 +246,7 @@ class boss_wrath_scryer_soccothrates : public CreatureScript
events.ScheduleEvent(EVENT_KNOCK_AWAY, urand(11000, 12000));
break;
case EVENT_ME_FIRST:
- if (Creature* dalliah = ObjectAccessor::GetCreature(*me, dalliahGUID))
+ if (Creature* dalliah = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_DALLIAH)))
if (dalliah->IsAlive() && !dalliah->IsInCombat())
dalliah->AI()->Talk(SAY_AGGRO_SOCCOTHRATES_FIRST);
break;
@@ -264,7 +257,7 @@ class boss_wrath_scryer_soccothrates : public CreatureScript
if (HealthBelowPct(25) && !dalliahTaunt)
{
- if (Creature* dalliah = ObjectAccessor::GetCreature(*me, dalliahGUID))
+ if (Creature* dalliah = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_DALLIAH)))
dalliah->AI()->Talk(SAY_SOCCOTHRATES_25_PERCENT);
dalliahTaunt = true;
}
@@ -272,16 +265,15 @@ class boss_wrath_scryer_soccothrates : public CreatureScript
DoMeleeAttackIfReady();
}
- private:
- bool preFight;
- bool dalliahTaunt;
- bool dalliahDeath;
- uint64 dalliahGUID;
+ private:
+ bool preFight;
+ bool dalliahTaunt;
+ bool dalliahDeath;
};
CreatureAI* GetAI(Creature* creature) const OVERRIDE
{
- return new boss_wrath_scryer_soccothratesAI(creature);
+ return GetArcatrazAI<boss_wrath_scryer_soccothratesAI>(creature);
}
};
diff --git a/src/server/scripts/Outland/TempestKeep/arcatraz/instance_arcatraz.cpp b/src/server/scripts/Outland/TempestKeep/arcatraz/instance_arcatraz.cpp
index 0145636f9d2..cb7cd3828e2 100644
--- a/src/server/scripts/Outland/TempestKeep/arcatraz/instance_arcatraz.cpp
+++ b/src/server/scripts/Outland/TempestKeep/arcatraz/instance_arcatraz.cpp
@@ -38,6 +38,8 @@ class instance_arcatraz : public InstanceMapScript
SetBossNumber(EncounterCount);
LoadDoorData(doorData);
+ DalliahGUID = 0;
+ SoccothratesGUID = 0;
MellicharGUID = 0;
WardensShieldGUID = 0;
@@ -49,8 +51,20 @@ class instance_arcatraz : public InstanceMapScript
void OnCreatureCreate(Creature* creature) OVERRIDE
{
- if (creature->GetEntry() == NPC_MELLICHAR)
- MellicharGUID = creature->GetGUID();
+ switch (creature->GetEntry())
+ {
+ case NPC_DALLIAH:
+ DalliahGUID = creature->GetGUID();
+ break;
+ case NPC_SOCCOTHRATES:
+ SoccothratesGUID = creature->GetGUID();
+ break;
+ case NPC_MELLICHAR:
+ MellicharGUID = creature->GetGUID();
+ break;
+ default:
+ break;
+ }
}
void OnGameObjectCreate(GameObject* go) OVERRIDE
@@ -102,29 +116,13 @@ class instance_arcatraz : public InstanceMapScript
switch (type)
{
case DATA_WARDEN_1:
- if (data == IN_PROGRESS)
- HandleGameObject(StasisPodGUIDs[0], true);
- StasisPodStates[0] = uint8(data);
- break;
case DATA_WARDEN_2:
- if (data == IN_PROGRESS)
- HandleGameObject(StasisPodGUIDs[1], true);
- StasisPodStates[1] = uint8(data);
- break;
case DATA_WARDEN_3:
- if (data == IN_PROGRESS)
- HandleGameObject(StasisPodGUIDs[2], true);
- StasisPodStates[2] = uint8(data);
- break;
case DATA_WARDEN_4:
- if (data == IN_PROGRESS)
- HandleGameObject(StasisPodGUIDs[3], true);
- StasisPodStates[3] = uint8(data);
- break;
case DATA_WARDEN_5:
if (data == IN_PROGRESS)
- HandleGameObject(StasisPodGUIDs[4], true);
- StasisPodStates[4] = uint8(data);
+ HandleGameObject(StasisPodGUIDs[type - DATA_WARDEN_1], true);
+ StasisPodStates[type - DATA_WARDEN_1] = uint8(data);
break;
case DATA_CONVERSATION:
ConversationState = uint8(data);
@@ -156,6 +154,10 @@ class instance_arcatraz : public InstanceMapScript
{
switch (data)
{
+ case DATA_DALLIAH:
+ return DalliahGUID;
+ case DATA_SOCCOTHRATES:
+ return SoccothratesGUID;
case DATA_MELLICHAR:
return MellicharGUID;
case DATA_WARDENS_SHIELD:
@@ -233,6 +235,8 @@ class instance_arcatraz : public InstanceMapScript
}
protected:
+ uint64 DalliahGUID;
+ uint64 SoccothratesGUID;
uint64 StasisPodGUIDs[5];
uint64 MellicharGUID;
uint64 WardensShieldGUID;
diff --git a/src/server/scripts/Outland/zone_blades_edge_mountains.cpp b/src/server/scripts/Outland/zone_blades_edge_mountains.cpp
index a005153a4fc..167fd7f2074 100644
--- a/src/server/scripts/Outland/zone_blades_edge_mountains.cpp
+++ b/src/server/scripts/Outland/zone_blades_edge_mountains.cpp
@@ -19,7 +19,7 @@
/* ScriptData
SDName: Blades_Edge_Mountains
SD%Complete: 90
-SDComment: Quest support: 10503, 10504, 10556, 10609, 10682, 10821, 10980. Ogri'la->Skettis Flight. (npc_daranelle needs bit more work before consider complete)
+SDComment: Quest support: 10503, 10504, 10556, 10594, 10609, 10682, 10821, 10980. Ogri'la->Skettis Flight. (npc_daranelle needs bit more work before consider complete)
SDCategory: Blade's Edge Mountains
EndScriptData */
@@ -40,6 +40,10 @@ EndContentData */
#include "GridNotifiersImpl.h"
#include "Cell.h"
#include "CellImpl.h"
+#include "SpellInfo.h"
+#include "SpellScript.h"
+#include "SpellAuras.h"
+#include "SpellAuraEffects.h"
//Support for quest: You're Fired! (10821)
bool obelisk_one, obelisk_two, obelisk_three, obelisk_four, obelisk_five;
@@ -1143,6 +1147,99 @@ class go_apexis_relic : public GameObjectScript
}
};
+/*######
+## npc_oscillating_frequency_scanner_master_bunny used for quest 10594 "Gauging the Resonant Frequency"
+######*/
+
+enum ScannerMasterBunny
+{
+ NPC_OSCILLATING_FREQUENCY_SCANNER_TOP_BUNNY = 21759,
+ SPELL_OSCILLATION_FIELD = 37408,
+ QUEST_GAUGING_THE_RESONANT_FREQUENCY = 10594
+};
+
+class npc_oscillating_frequency_scanner_master_bunny : public CreatureScript
+{
+public:
+ npc_oscillating_frequency_scanner_master_bunny() : CreatureScript("npc_oscillating_frequency_scanner_master_bunny") { }
+
+ struct npc_oscillating_frequency_scanner_master_bunnyAI : public ScriptedAI
+ {
+ npc_oscillating_frequency_scanner_master_bunnyAI(Creature* creature) : ScriptedAI(creature) { }
+
+ void Reset() OVERRIDE
+ {
+ if (GetClosestCreatureWithEntry(me, NPC_OSCILLATING_FREQUENCY_SCANNER_TOP_BUNNY, 25.0f))
+ me->DespawnOrUnsummon();
+ else
+ {
+ // Spell 37392 does not exist in dbc, manually spawning
+ me->SummonCreature(21759, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ() + 0.5f, me->GetOrientation(), TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 50000);
+ me->SummonGameObject(184926, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), me->GetOrientation(), 0, 0, 0, 0, 50000);
+ me->DespawnOrUnsummon(50000);
+ }
+
+ timer = 500;
+ }
+
+ void IsSummonedBy(Unit* summoner) OVERRIDE
+ {
+ if (summoner->isType(TYPEMASK_PLAYER))
+ playerGuid = summoner->GetGUID();
+ }
+
+ void UpdateAI(uint32 diff) OVERRIDE
+ {
+ if (timer <= diff)
+ {
+ if (Player* player = ObjectAccessor::GetPlayer(*me, playerGuid))
+ DoCast(player, SPELL_OSCILLATION_FIELD);
+
+ timer = 3000;
+ }
+ else
+ timer -= diff;
+ }
+
+ private:
+ uint64 playerGuid;
+ uint32 timer;
+ };
+
+ CreatureAI* GetAI(Creature* creature) const OVERRIDE
+ {
+ return new npc_oscillating_frequency_scanner_master_bunnyAI(creature);
+ }
+};
+
+class spell_oscillating_field : public SpellScriptLoader
+{
+ public:
+ spell_oscillating_field() : SpellScriptLoader("spell_oscillating_field") { }
+
+ class spell_oscillating_field_SpellScript : public SpellScript
+ {
+ PrepareSpellScript(spell_oscillating_field_SpellScript);
+
+ void HandleEffect(SpellEffIndex /*effIndex*/)
+ {
+ if (Player* player = GetHitPlayer())
+ if (player->GetAuraCount(SPELL_OSCILLATION_FIELD) == 5 && player->GetQuestStatus(QUEST_GAUGING_THE_RESONANT_FREQUENCY) == QUEST_STATUS_INCOMPLETE)
+ player->CompleteQuest(QUEST_GAUGING_THE_RESONANT_FREQUENCY);
+ }
+
+ void Register() OVERRIDE
+ {
+ OnEffectHitTarget += SpellEffectFn(spell_oscillating_field_SpellScript::HandleEffect, EFFECT_0, SPELL_EFFECT_APPLY_AURA);
+ }
+ };
+
+ SpellScript* GetSpellScript() const OVERRIDE
+ {
+ return new spell_oscillating_field_SpellScript();
+ }
+};
+
void AddSC_blades_edge_mountains()
{
new npc_bladespire_ogre();
@@ -1157,4 +1254,6 @@ void AddSC_blades_edge_mountains()
new npc_simon_bunny();
new go_simon_cluster();
new go_apexis_relic();
+ new npc_oscillating_frequency_scanner_master_bunny();
+ new spell_oscillating_field();
}