aboutsummaryrefslogtreecommitdiff
path: root/src/server/scripts
diff options
context:
space:
mode:
Diffstat (limited to 'src/server/scripts')
-rw-r--r--src/server/scripts/Commands/cs_misc.cpp4
-rw-r--r--src/server/scripts/Commands/cs_npc.cpp33
-rw-r--r--src/server/scripts/Commands/cs_reload.cpp10
-rw-r--r--src/server/scripts/Commands/cs_wp.cpp4
-rw-r--r--src/server/scripts/EasternKingdoms/Deadmines/instance_deadmines.cpp22
-rw-r--r--src/server/scripts/EasternKingdoms/Karazhan/karazhan.cpp18
-rw-r--r--src/server/scripts/EasternKingdoms/ScarletMonastery/boss_headless_horseman.cpp8
-rw-r--r--src/server/scripts/EasternKingdoms/Scholomance/boss_vectus.cpp1
-rw-r--r--src/server/scripts/EasternKingdoms/SunwellPlateau/boss_kalecgos.cpp2
-rw-r--r--src/server/scripts/EasternKingdoms/ZulAman/boss_hexlord.cpp12
-rw-r--r--src/server/scripts/EasternKingdoms/ZulAman/boss_nalorakk.cpp24
-rw-r--r--src/server/scripts/EasternKingdoms/zone_silverpine_forest.cpp4
-rw-r--r--src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjalAI.cpp2
-rw-r--r--src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/instance_hyjal.cpp12
-rw-r--r--src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_mal_ganis.cpp2
-rw-r--r--src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_meathook.cpp1
-rw-r--r--src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_salramm_the_fleshcrafter.cpp173
-rw-r--r--src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/instance_culling_of_stratholme.cpp1
-rw-r--r--src/server/scripts/Kalimdor/OnyxiasLair/boss_onyxia.cpp7
-rw-r--r--src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/instance_trial_of_the_crusader.cpp1
-rw-r--r--src/server/scripts/Northrend/Naxxramas/boss_gluth.cpp2
-rw-r--r--src/server/scripts/Northrend/Naxxramas/boss_maexxna.cpp12
-rw-r--r--src/server/scripts/Northrend/Naxxramas/boss_noth.cpp6
-rw-r--r--src/server/scripts/Northrend/Naxxramas/boss_patchwerk.cpp5
-rw-r--r--src/server/scripts/Northrend/Naxxramas/boss_sapphiron.cpp21
-rw-r--r--src/server/scripts/Northrend/Naxxramas/boss_thaddius.cpp21
-rw-r--r--src/server/scripts/Northrend/Naxxramas/instance_naxxramas.cpp5
-rw-r--r--src/server/scripts/Northrend/Nexus/EyeOfEternity/boss_malygos.cpp31
-rw-r--r--src/server/scripts/Northrend/Nexus/Nexus/boss_anomalus.cpp25
-rw-r--r--src/server/scripts/Northrend/Nexus/Nexus/boss_keristrasza.cpp18
-rw-r--r--src/server/scripts/Northrend/Nexus/Nexus/boss_magus_telestra.cpp42
-rw-r--r--src/server/scripts/Northrend/Nexus/Nexus/boss_ormorok.cpp12
-rw-r--r--src/server/scripts/Northrend/Nexus/Oculus/boss_drakos.cpp24
-rw-r--r--src/server/scripts/Northrend/Nexus/Oculus/boss_eregos.cpp14
-rw-r--r--src/server/scripts/Northrend/Nexus/Oculus/boss_urom.cpp18
-rw-r--r--src/server/scripts/Northrend/Nexus/Oculus/boss_varos.cpp22
-rw-r--r--src/server/scripts/Northrend/Nexus/Oculus/oculus.cpp8
-rw-r--r--src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_bjarngrim.cpp52
-rw-r--r--src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_ionar.cpp32
-rw-r--r--src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_loken.cpp16
-rw-r--r--src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_volkhan.cpp50
-rw-r--r--src/server/scripts/Northrend/Ulduar/HallsOfStone/boss_sjonnir.cpp24
-rw-r--r--src/server/scripts/Northrend/Ulduar/HallsOfStone/halls_of_stone.cpp38
-rw-r--r--src/server/scripts/Northrend/Ulduar/Ulduar/boss_algalon_the_observer.cpp21
-rw-r--r--src/server/scripts/Northrend/Ulduar/Ulduar/boss_assembly_of_iron.cpp36
-rw-r--r--src/server/scripts/Northrend/Ulduar/Ulduar/boss_auriaya.cpp10
-rw-r--r--src/server/scripts/Northrend/Ulduar/Ulduar/boss_flame_leviathan.cpp60
-rw-r--r--src/server/scripts/Northrend/Ulduar/Ulduar/boss_freya.cpp127
-rw-r--r--src/server/scripts/Northrend/Ulduar/Ulduar/boss_general_vezax.cpp14
-rw-r--r--src/server/scripts/Northrend/Ulduar/Ulduar/boss_hodir.cpp42
-rw-r--r--src/server/scripts/Northrend/Ulduar/Ulduar/boss_ignis.cpp32
-rw-r--r--src/server/scripts/Northrend/Ulduar/Ulduar/boss_razorscale.cpp125
-rw-r--r--src/server/scripts/Northrend/Ulduar/Ulduar/boss_xt002.cpp86
-rw-r--r--src/server/scripts/Northrend/Ulduar/Ulduar/boss_yogg_saron.cpp19
-rw-r--r--src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/boss_ingvar_the_plunderer.cpp3
-rw-r--r--src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/boss_keleseth.cpp12
-rw-r--r--src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_palehoof.cpp89
-rw-r--r--src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_skadi.cpp26
-rw-r--r--src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_svala.cpp35
-rw-r--r--src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_ymiron.cpp380
-rw-r--r--src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/utgarde_pinnacle.h14
-rw-r--r--src/server/scripts/Northrend/VaultOfArchavon/boss_emalon.cpp8
-rw-r--r--src/server/scripts/Northrend/VaultOfArchavon/boss_toravon.cpp8
-rw-r--r--src/server/scripts/Northrend/VioletHold/boss_cyanigosa.cpp16
-rw-r--r--src/server/scripts/Northrend/VioletHold/boss_erekem.cpp28
-rw-r--r--src/server/scripts/Northrend/VioletHold/boss_ichoron.cpp24
-rw-r--r--src/server/scripts/Northrend/zone_sholazar_basin.cpp6
-rw-r--r--src/server/scripts/Outland/BlackTemple/boss_illidan.cpp5
-rw-r--r--src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_fathomlord_karathress.cpp2
-rw-r--r--src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_lurker_below.cpp2
-rw-r--r--src/server/scripts/Outland/HellfireCitadel/HellfireRamparts/boss_watchkeeper_gargolmar.cpp2
-rw-r--r--src/server/scripts/Outland/HellfireCitadel/MagtheridonsLair/instance_magtheridons_lair.cpp2
-rw-r--r--src/server/scripts/Spells/spell_generic.cpp32
-rw-r--r--src/server/scripts/Spells/spell_quest.cpp6
74 files changed, 1279 insertions, 832 deletions
diff --git a/src/server/scripts/Commands/cs_misc.cpp b/src/server/scripts/Commands/cs_misc.cpp
index 31ceeaf460d..8e720e9faba 100644
--- a/src/server/scripts/Commands/cs_misc.cpp
+++ b/src/server/scripts/Commands/cs_misc.cpp
@@ -2266,7 +2266,7 @@ public:
// Get the args that we might have (up to 2)
char const* arg1 = strtok((char*)args, " ");
char const* arg2 = strtok(NULL, " ");
-
+
// Analyze them to see if we got either a playerName or duration or both
if (arg1)
{
@@ -2452,7 +2452,7 @@ public:
}
WorldPacket data(SMSG_PLAY_SOUND, 4);
- data << uint32(soundId) << handler->GetSession()->GetPlayer()->GetGUID();
+ data << uint32(soundId);
sWorld->SendGlobalMessage(&data);
handler->PSendSysMessage(LANG_COMMAND_PLAYED_TO_ALL, soundId);
diff --git a/src/server/scripts/Commands/cs_npc.cpp b/src/server/scripts/Commands/cs_npc.cpp
index 5f3f82cf1db..5f4c8d0dfd4 100644
--- a/src/server/scripts/Commands/cs_npc.cpp
+++ b/src/server/scripts/Commands/cs_npc.cpp
@@ -761,8 +761,8 @@ public:
handler->PSendSysMessage(npcFlagTexts[i].Name, npcFlagTexts[i].Value);
handler->PSendSysMessage(LANG_NPCINFO_MECHANIC_IMMUNE, mechanicImmuneMask);
- for (uint8 i = 0; i < MAX_MECHANIC; ++i)
- if ((mechanicImmuneMask << 1) & mechanicImmunes[i].Value)
+ for (uint8 i = 1; i < MAX_MECHANIC; ++i)
+ if (mechanicImmuneMask & (1 << (mechanicImmunes[i].Value - 1)))
handler->PSendSysMessage("%s (0x%X)", mechanicImmunes[i].Name, mechanicImmunes[i].Value);
return true;
@@ -1222,7 +1222,7 @@ public:
return false;
}
- creature->MonsterSay(args, LANG_UNIVERSAL, NULL);
+ creature->Say(args, LANG_UNIVERSAL);
// make some emotes
char lastchar = args[strlen(args) - 1];
@@ -1251,7 +1251,7 @@ public:
return false;
}
- creature->MonsterTextEmote(args, 0);
+ creature->TextEmote(args);
return true;
}
@@ -1297,14 +1297,29 @@ public:
static bool HandleNpcWhisperCommand(ChatHandler* handler, char const* args)
{
if (!*args)
+ {
+ handler->SendSysMessage(LANG_CMD_SYNTAX);
+ handler->SetSentErrorMessage(true);
return false;
+ }
char* receiver_str = strtok((char*)args, " ");
char* text = strtok(NULL, "");
+ if (!receiver_str || !text)
+ {
+ handler->SendSysMessage(LANG_CMD_SYNTAX);
+ handler->SetSentErrorMessage(true);
+ return false;
+ }
+
Creature* creature = handler->getSelectedCreature();
- if (!creature || !receiver_str || !text)
+ if (!creature)
+ {
+ handler->SendSysMessage(LANG_SELECT_CREATURE);
+ handler->SetSentErrorMessage(true);
return false;
+ }
ObjectGuid receiver_guid(HIGHGUID_PLAYER, uint32(atol(receiver_str)));
@@ -1313,14 +1328,18 @@ public:
if (handler->HasLowerSecurity(receiver, ObjectGuid::Empty))
return false;
- creature->MonsterWhisper(text, receiver);
+ creature->Whisper(text, LANG_UNIVERSAL, receiver);
return true;
}
static bool HandleNpcYellCommand(ChatHandler* handler, char const* args)
{
if (!*args)
+ {
+ handler->SendSysMessage(LANG_CMD_SYNTAX);
+ handler->SetSentErrorMessage(true);
return false;
+ }
Creature* creature = handler->getSelectedCreature();
if (!creature)
@@ -1330,7 +1349,7 @@ public:
return false;
}
- creature->MonsterYell(args, LANG_UNIVERSAL, NULL);
+ creature->Yell(args, LANG_UNIVERSAL);
// make an emote
creature->HandleEmoteCommand(EMOTE_ONESHOT_SHOUT);
diff --git a/src/server/scripts/Commands/cs_reload.cpp b/src/server/scripts/Commands/cs_reload.cpp
index 70aacbfc227..5f061fab595 100644
--- a/src/server/scripts/Commands/cs_reload.cpp
+++ b/src/server/scripts/Commands/cs_reload.cpp
@@ -88,7 +88,6 @@ public:
{ "creature_queststarter", rbac::RBAC_PERM_COMMAND_RELOAD_CREATURE_QUESTSTARTER, true, &HandleReloadCreatureQuestStarterCommand, "", NULL },
{ "creature_summon_groups", rbac::RBAC_PERM_COMMAND_RELOAD_CREATURE_SUMMON_GROUPS, true, &HandleReloadCreatureSummonGroupsCommand, "", NULL },
{ "creature_template", rbac::RBAC_PERM_COMMAND_RELOAD_CREATURE_TEMPLATE, true, &HandleReloadCreatureTemplateCommand, "", NULL },
- //{ "db_script_string", rbac::RBAC_PERM_COMMAND_RELOAD_, true, &HandleReloadDbScriptStringCommand, "", NULL },
{ "disables", rbac::RBAC_PERM_COMMAND_RELOAD_DISABLES, true, &HandleReloadDisablesCommand, "", NULL },
{ "disenchant_loot_template", rbac::RBAC_PERM_COMMAND_RELOAD_DISENCHANT_LOOT_TEMPLATE, true, &HandleReloadLootTemplatesDisenchantCommand, "", NULL },
{ "event_scripts", rbac::RBAC_PERM_COMMAND_RELOAD_EVENT_SCRIPTS, true, &HandleReloadEventScriptsCommand, "", NULL },
@@ -266,7 +265,6 @@ public:
HandleReloadEventScriptsCommand(handler, "a");
HandleReloadSpellScriptsCommand(handler, "a");
handler->SendGlobalGMSysMessage("DB tables `*_scripts` reloaded.");
- HandleReloadDbScriptStringCommand(handler, "a");
HandleReloadWpScriptsCommand(handler, "a");
HandleReloadWpCommand(handler, "a");
return true;
@@ -960,14 +958,6 @@ public:
return true;
}
- static bool HandleReloadDbScriptStringCommand(ChatHandler* handler, const char* /*args*/)
- {
- TC_LOG_INFO("misc", "Re-Loading Script strings from `db_script_string`...");
- sObjectMgr->LoadDbScriptStrings();
- handler->SendGlobalGMSysMessage("DB table `db_script_string` reloaded.");
- return true;
- }
-
static bool HandleReloadGameGraveyardZoneCommand(ChatHandler* handler, const char* /*args*/)
{
TC_LOG_INFO("misc", "Re-Loading Graveyard-zone links...");
diff --git a/src/server/scripts/Commands/cs_wp.cpp b/src/server/scripts/Commands/cs_wp.cpp
index bb5b6554ebc..9b2667148a6 100644
--- a/src/server/scripts/Commands/cs_wp.cpp
+++ b/src/server/scripts/Commands/cs_wp.cpp
@@ -214,7 +214,7 @@ public:
target->LoadPath(pathid);
target->SetDefaultMovementType(WAYPOINT_MOTION_TYPE);
target->GetMotionMaster()->Initialize();
- target->MonsterSay("Path loaded.", LANG_UNIVERSAL, NULL);
+ target->Say("Path loaded.", LANG_UNIVERSAL);
return true;
}
@@ -267,7 +267,7 @@ public:
target->SetDefaultMovementType(IDLE_MOTION_TYPE);
target->GetMotionMaster()->MoveTargetedHome();
target->GetMotionMaster()->Initialize();
- target->MonsterSay("Path unloaded.", LANG_UNIVERSAL, NULL);
+ target->Say("Path unloaded.", LANG_UNIVERSAL);
return true;
}
diff --git a/src/server/scripts/EasternKingdoms/Deadmines/instance_deadmines.cpp b/src/server/scripts/EasternKingdoms/Deadmines/instance_deadmines.cpp
index 4b899235dd1..d7667b37e87 100644
--- a/src/server/scripts/EasternKingdoms/Deadmines/instance_deadmines.cpp
+++ b/src/server/scripts/EasternKingdoms/Deadmines/instance_deadmines.cpp
@@ -28,7 +28,6 @@ EndScriptData */
#include "deadmines.h"
#include "TemporarySummon.h"
#include "WorldPacket.h"
-#include "Opcodes.h"
enum Sounds
{
@@ -93,9 +92,9 @@ class instance_deadmines : public InstanceMapScript
case CANNON_GUNPOWDER_USED:
CannonBlast_Timer = DATA_CANNON_BLAST_TIMER;
// it's a hack - Mr. Smite should do that but his too far away
- pIronCladDoor->SetName("Mr. Smite");
- pIronCladDoor->MonsterYell(SAY_MR_SMITE_ALARM1, LANG_UNIVERSAL, NULL);
- DoPlaySound(pIronCladDoor, SOUND_MR_SMITE_ALARM1);
+ //pIronCladDoor->SetName("Mr. Smite");
+ //pIronCladDoor->MonsterYell(SAY_MR_SMITE_ALARM1, LANG_UNIVERSAL, NULL);
+ pIronCladDoor->PlayDirectSound(SOUND_MR_SMITE_ALARM1);
State = CANNON_BLAST_INITIATED;
break;
case CANNON_BLAST_INITIATED:
@@ -106,8 +105,8 @@ class instance_deadmines : public InstanceMapScript
ShootCannon();
BlastOutDoor();
LeverStucked();
- pIronCladDoor->MonsterYell(SAY_MR_SMITE_ALARM2, LANG_UNIVERSAL, NULL);
- DoPlaySound(pIronCladDoor, SOUND_MR_SMITE_ALARM2);
+ //pIronCladDoor->MonsterYell(SAY_MR_SMITE_ALARM2, LANG_UNIVERSAL, NULL);
+ pIronCladDoor->PlayDirectSound(SOUND_MR_SMITE_ALARM2);
State = PIRATES_ATTACK;
} else CannonBlast_Timer -= diff;
break;
@@ -162,7 +161,7 @@ class instance_deadmines : public InstanceMapScript
if (GameObject* pDefiasCannon = instance->GetGameObject(DefiasCannonGUID))
{
pDefiasCannon->SetGoState(GO_STATE_ACTIVE);
- DoPlaySound(pDefiasCannon, SOUND_CANNONFIRE);
+ pDefiasCannon->PlayDirectSound(SOUND_CANNONFIRE);
}
}
@@ -171,7 +170,7 @@ class instance_deadmines : public InstanceMapScript
if (GameObject* pIronCladDoor = instance->GetGameObject(IronCladDoorGUID))
{
pIronCladDoor->SetGoState(GO_STATE_ACTIVE_ALTERNATIVE);
- DoPlaySound(pIronCladDoor, SOUND_DESTROYDOOR);
+ pIronCladDoor->PlayDirectSound(SOUND_DESTROYDOOR);
}
}
@@ -230,13 +229,6 @@ class instance_deadmines : public InstanceMapScript
return ObjectGuid::Empty;
}
-
- void DoPlaySound(GameObject* unit, uint32 sound)
- {
- WorldPacket data(SMSG_PLAY_SOUND, 4);
- data << uint32(sound);
- unit->SendMessageToSet(&data, false);
- }
};
InstanceScript* GetInstanceScript(InstanceMap* map) const override
diff --git a/src/server/scripts/EasternKingdoms/Karazhan/karazhan.cpp b/src/server/scripts/EasternKingdoms/Karazhan/karazhan.cpp
index dc160c4167d..159035c6eb3 100644
--- a/src/server/scripts/EasternKingdoms/Karazhan/karazhan.cpp
+++ b/src/server/scripts/EasternKingdoms/Karazhan/karazhan.cpp
@@ -560,25 +560,25 @@ public:
{
case 0: return 9999999;
case 1:
- me->MonsterYell(SAY_DIALOG_MEDIVH_1, LANG_UNIVERSAL, NULL);
+ me->Yell(SAY_DIALOG_MEDIVH_1, LANG_UNIVERSAL);
return 10000;
case 2:
if (arca)
- arca->MonsterYell(SAY_DIALOG_ARCANAGOS_2, LANG_UNIVERSAL, NULL);
+ arca->Yell(SAY_DIALOG_ARCANAGOS_2, LANG_UNIVERSAL);
return 20000;
case 3:
- me->MonsterYell(SAY_DIALOG_MEDIVH_3, LANG_UNIVERSAL, NULL);
+ me->Yell(SAY_DIALOG_MEDIVH_3, LANG_UNIVERSAL);
return 10000;
case 4:
if (arca)
- arca->MonsterYell(SAY_DIALOG_ARCANAGOS_4, LANG_UNIVERSAL, NULL);
+ arca->Yell(SAY_DIALOG_ARCANAGOS_4, LANG_UNIVERSAL);
return 20000;
case 5:
- me->MonsterYell(SAY_DIALOG_MEDIVH_5, LANG_UNIVERSAL, NULL);
+ me->Yell(SAY_DIALOG_MEDIVH_5, LANG_UNIVERSAL);
return 20000;
case 6:
if (arca)
- arca->MonsterYell(SAY_DIALOG_ARCANAGOS_6, LANG_UNIVERSAL, NULL);
+ arca->Yell(SAY_DIALOG_ARCANAGOS_6, LANG_UNIVERSAL);
return 10000;
case 7:
FireArcanagosTimer = 500;
@@ -588,7 +588,7 @@ public:
DoCast(me, SPELL_MANA_SHIELD);
return 10000;
case 9:
- me->MonsterTextEmote(EMOTE_DIALOG_MEDIVH_7, NULL, false);
+ me->TextEmote(EMOTE_DIALOG_MEDIVH_7);
return 10000;
case 10:
if (arca)
@@ -596,7 +596,7 @@ public:
return 1000;
case 11:
if (arca)
- arca->MonsterYell(SAY_DIALOG_ARCANAGOS_8, LANG_UNIVERSAL, NULL);
+ arca->Yell(SAY_DIALOG_ARCANAGOS_8, LANG_UNIVERSAL);
return 5000;
case 12:
if (arca)
@@ -608,7 +608,7 @@ public:
}
return 10000;
case 13:
- me->MonsterYell(SAY_DIALOG_MEDIVH_9, LANG_UNIVERSAL, NULL);
+ me->Yell(SAY_DIALOG_MEDIVH_9, LANG_UNIVERSAL);
return 10000;
case 14:
me->SetVisible(false);
diff --git a/src/server/scripts/EasternKingdoms/ScarletMonastery/boss_headless_horseman.cpp b/src/server/scripts/EasternKingdoms/ScarletMonastery/boss_headless_horseman.cpp
index 347cd2cfab2..58165df48ef 100644
--- a/src/server/scripts/EasternKingdoms/ScarletMonastery/boss_headless_horseman.cpp
+++ b/src/server/scripts/EasternKingdoms/ScarletMonastery/boss_headless_horseman.cpp
@@ -352,7 +352,7 @@ public:
Creature* speaker = DoSpawnCreature(HELPER, 0, 0, 0, 0, TEMPSUMMON_TIMED_DESPAWN, 1000);
if (speaker)
speaker->CastSpell(speaker, SPELL_HEAD_SPEAKS, false);
- me->MonsterTextEmote(EMOTE_LAUGHS, NULL);
+ me->TextEmote(EMOTE_LAUGHS);
}
else laugh -= diff;
}
@@ -668,14 +668,14 @@ public:
if (count < 3)
{
if (player)
- player->Say(Text[count], 0);
+ player->Say(Text[count], LANG_UNIVERSAL);
}
else
{
DoCast(me, SPELL_RHYME_BIG);
if (player)
{
- player->Say(Text[count], 0);
+ player->Say(Text[count], LANG_UNIVERSAL);
player->HandleEmoteCommand(ANIM_EMOTE_SHOUT);
}
wp_reached = true;
@@ -733,7 +733,7 @@ public:
if (laugh <= diff)
{
laugh = urand(11000, 22000);
- me->MonsterTextEmote(EMOTE_LAUGHS, NULL);
+ me->TextEmote(EMOTE_LAUGHS);
DoPlaySoundToSet(me, RandomLaugh[rand32() % 3]);
}
else laugh -= diff;
diff --git a/src/server/scripts/EasternKingdoms/Scholomance/boss_vectus.cpp b/src/server/scripts/EasternKingdoms/Scholomance/boss_vectus.cpp
index dcb212eead8..f5b1dc34062 100644
--- a/src/server/scripts/EasternKingdoms/Scholomance/boss_vectus.cpp
+++ b/src/server/scripts/EasternKingdoms/Scholomance/boss_vectus.cpp
@@ -89,6 +89,7 @@ public:
case EVENT_BLAST_WAVE:
DoCast(me, SPELL_BLAST_WAVE);
events.ScheduleEvent(EVENT_BLAST_WAVE, 12000);
+ break;
case EVENT_FRENZY:
DoCast(me, SPELL_FRENZY);
Talk(EMOTE_FRENZY);
diff --git a/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_kalecgos.cpp b/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_kalecgos.cpp
index c8354bde428..f88c9c6159e 100644
--- a/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_kalecgos.cpp
+++ b/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_kalecgos.cpp
@@ -766,7 +766,7 @@ public:
}
else
{
- me->MonsterTextEmote(EMOTE_UNABLE_TO_FIND, NULL);
+ me->TextEmote(EMOTE_UNABLE_TO_FIND);
EnterEvadeMode();
return;
}
diff --git a/src/server/scripts/EasternKingdoms/ZulAman/boss_hexlord.cpp b/src/server/scripts/EasternKingdoms/ZulAman/boss_hexlord.cpp
index c33ad16f265..55f7af71253 100644
--- a/src/server/scripts/EasternKingdoms/ZulAman/boss_hexlord.cpp
+++ b/src/server/scripts/EasternKingdoms/ZulAman/boss_hexlord.cpp
@@ -306,7 +306,7 @@ class boss_hexlord_malacrass : public CreatureScript
instance->SetData(DATA_HEXLORDEVENT, IN_PROGRESS);
DoZoneInCombat();
- me->MonsterYell(YELL_AGGRO, LANG_UNIVERSAL, NULL);
+ me->Yell(YELL_AGGRO, LANG_UNIVERSAL);
DoPlaySoundToSet(me, SOUND_YELL_AGGRO);
for (uint8 i = 0; i < 4; ++i)
@@ -327,11 +327,11 @@ class boss_hexlord_malacrass : public CreatureScript
switch (urand(0, 1))
{
case 0:
- me->MonsterYell(YELL_KILL_ONE, LANG_UNIVERSAL, NULL);
+ me->Yell(YELL_KILL_ONE, LANG_UNIVERSAL);
DoPlaySoundToSet(me, SOUND_YELL_KILL_ONE);
break;
case 1:
- me->MonsterYell(YELL_KILL_TWO, LANG_UNIVERSAL, NULL);
+ me->Yell(YELL_KILL_TWO, LANG_UNIVERSAL);
DoPlaySoundToSet(me, SOUND_YELL_KILL_TWO);
break;
}
@@ -341,7 +341,7 @@ class boss_hexlord_malacrass : public CreatureScript
{
instance->SetData(DATA_HEXLORDEVENT, DONE);
- me->MonsterYell(YELL_DEATH, LANG_UNIVERSAL, NULL);
+ me->Yell(YELL_DEATH, LANG_UNIVERSAL);
DoPlaySoundToSet(me, SOUND_YELL_DEATH);
for (uint8 i = 0; i < 4; ++i)
@@ -415,7 +415,7 @@ class boss_hexlord_malacrass : public CreatureScript
if (DrainPower_Timer <= diff)
{
DoCast(me, SPELL_DRAIN_POWER, true);
- me->MonsterYell(YELL_DRAIN_POWER, LANG_UNIVERSAL, NULL);
+ me->Yell(YELL_DRAIN_POWER, LANG_UNIVERSAL);
DoPlaySoundToSet(me, SOUND_YELL_DRAIN_POWER);
DrainPower_Timer = urand(40000, 55000); // must cast in 60 sec, or buff/debuff will disappear
} else DrainPower_Timer -= diff;
@@ -427,7 +427,7 @@ class boss_hexlord_malacrass : public CreatureScript
else
{
DoCast(me, SPELL_SPIRIT_BOLTS, false);
- me->MonsterYell(YELL_SPIRIT_BOLTS, LANG_UNIVERSAL, NULL);
+ me->Yell(YELL_SPIRIT_BOLTS, LANG_UNIVERSAL);
DoPlaySoundToSet(me, SOUND_YELL_SPIRIT_BOLTS);
SpiritBolts_Timer = 40000;
SiphonSoul_Timer = 10000; // ready to drain
diff --git a/src/server/scripts/EasternKingdoms/ZulAman/boss_nalorakk.cpp b/src/server/scripts/EasternKingdoms/ZulAman/boss_nalorakk.cpp
index c9c028021f1..279ca60a484 100644
--- a/src/server/scripts/EasternKingdoms/ZulAman/boss_nalorakk.cpp
+++ b/src/server/scripts/EasternKingdoms/ZulAman/boss_nalorakk.cpp
@@ -227,7 +227,7 @@ class boss_nalorakk : public CreatureScript
case 0:
if (me->IsWithinDistInMap(who, 50))
{
- me->MonsterYell(YELL_NALORAKK_WAVE1, LANG_UNIVERSAL, NULL);
+ me->Yell(YELL_NALORAKK_WAVE1, LANG_UNIVERSAL);
DoPlaySoundToSet(me, SOUND_NALORAKK_WAVE1);
(*me).GetMotionMaster()->MovePoint(1, NalorakkWay[1][0], NalorakkWay[1][1], NalorakkWay[1][2]);
@@ -240,7 +240,7 @@ class boss_nalorakk : public CreatureScript
case 2:
if (me->IsWithinDistInMap(who, 40))
{
- me->MonsterYell(YELL_NALORAKK_WAVE2, LANG_UNIVERSAL, NULL);
+ me->Yell(YELL_NALORAKK_WAVE2, LANG_UNIVERSAL);
DoPlaySoundToSet(me, SOUND_NALORAKK_WAVE2);
(*me).GetMotionMaster()->MovePoint(3, NalorakkWay[3][0], NalorakkWay[3][1], NalorakkWay[3][2]);
@@ -253,7 +253,7 @@ class boss_nalorakk : public CreatureScript
case 5:
if (me->IsWithinDistInMap(who, 40))
{
- me->MonsterYell(YELL_NALORAKK_WAVE3, LANG_UNIVERSAL, NULL);
+ me->Yell(YELL_NALORAKK_WAVE3, LANG_UNIVERSAL);
DoPlaySoundToSet(me, SOUND_NALORAKK_WAVE3);
(*me).GetMotionMaster()->MovePoint(6, NalorakkWay[6][0], NalorakkWay[6][1], NalorakkWay[6][2]);
@@ -268,7 +268,7 @@ class boss_nalorakk : public CreatureScript
{
SendAttacker(who);
- me->MonsterYell(YELL_NALORAKK_WAVE4, LANG_UNIVERSAL, NULL);
+ me->Yell(YELL_NALORAKK_WAVE4, LANG_UNIVERSAL);
DoPlaySoundToSet(me, SOUND_NALORAKK_WAVE4);
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
@@ -287,7 +287,7 @@ class boss_nalorakk : public CreatureScript
{
instance->SetData(DATA_NALORAKKEVENT, IN_PROGRESS);
- me->MonsterYell(YELL_AGGRO, LANG_UNIVERSAL, NULL);
+ me->Yell(YELL_AGGRO, LANG_UNIVERSAL);
DoPlaySoundToSet(me, SOUND_YELL_AGGRO);
DoZoneInCombat();
}
@@ -296,7 +296,7 @@ class boss_nalorakk : public CreatureScript
{
instance->SetData(DATA_NALORAKKEVENT, DONE);
- me->MonsterYell(YELL_DEATH, LANG_UNIVERSAL, NULL);
+ me->Yell(YELL_DEATH, LANG_UNIVERSAL);
DoPlaySoundToSet(me, SOUND_YELL_DEATH);
}
@@ -305,11 +305,11 @@ class boss_nalorakk : public CreatureScript
switch (urand(0, 1))
{
case 0:
- me->MonsterYell(YELL_KILL_ONE, LANG_UNIVERSAL, NULL);
+ me->Yell(YELL_KILL_ONE, LANG_UNIVERSAL);
DoPlaySoundToSet(me, SOUND_YELL_KILL_ONE);
break;
case 1:
- me->MonsterYell(YELL_KILL_TWO, LANG_UNIVERSAL, NULL);
+ me->Yell(YELL_KILL_TWO, LANG_UNIVERSAL);
DoPlaySoundToSet(me, SOUND_YELL_KILL_TWO);
break;
}
@@ -373,7 +373,7 @@ class boss_nalorakk : public CreatureScript
if (Berserk_Timer <= diff)
{
DoCast(me, SPELL_BERSERK, true);
- me->MonsterYell(YELL_BERSERK, LANG_UNIVERSAL, NULL);
+ me->Yell(YELL_BERSERK, LANG_UNIVERSAL);
DoPlaySoundToSet(me, SOUND_YELL_BERSERK);
Berserk_Timer = 600000;
} else Berserk_Timer -= diff;
@@ -383,7 +383,7 @@ class boss_nalorakk : public CreatureScript
if (inBearForm)
{
// me->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID + 1, 5122);
- me->MonsterYell(YELL_SHIFTEDTOTROLL, LANG_UNIVERSAL, NULL);
+ me->Yell(YELL_SHIFTEDTOTROLL, LANG_UNIVERSAL);
DoPlaySoundToSet(me, SOUND_YELL_TOTROLL);
me->RemoveAurasDueToSpell(SPELL_BEARFORM);
Surge_Timer = urand(15000, 20000);
@@ -395,7 +395,7 @@ class boss_nalorakk : public CreatureScript
else
{
// me->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID + 1, 0);
- me->MonsterYell(YELL_SHIFTEDTOBEAR, LANG_UNIVERSAL, NULL);
+ me->Yell(YELL_SHIFTEDTOBEAR, LANG_UNIVERSAL);
DoPlaySoundToSet(me, SOUND_YELL_TOBEAR);
DoCast(me, SPELL_BEARFORM, true);
LaceratingSlash_Timer = 2000; // dur 18s
@@ -426,7 +426,7 @@ class boss_nalorakk : public CreatureScript
if (Surge_Timer <= diff)
{
- me->MonsterYell(YELL_SURGE, LANG_UNIVERSAL, NULL);
+ me->Yell(YELL_SURGE, LANG_UNIVERSAL);
DoPlaySoundToSet(me, SOUND_YELL_SURGE);
Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1, 45, true);
if (target)
diff --git a/src/server/scripts/EasternKingdoms/zone_silverpine_forest.cpp b/src/server/scripts/EasternKingdoms/zone_silverpine_forest.cpp
index cea11ab043e..b725712d473 100644
--- a/src/server/scripts/EasternKingdoms/zone_silverpine_forest.cpp
+++ b/src/server/scripts/EasternKingdoms/zone_silverpine_forest.cpp
@@ -280,7 +280,7 @@ public:
{
case 0:
if (WaitTimer == WAIT_SECS)
- me->MonsterSay(NPCSAY_INIT, LANG_UNIVERSAL, NULL); //no blizzlike
+ me->Say(NPCSAY_INIT, LANG_UNIVERSAL); //no blizzlike
if (WaitTimer <= diff)
{
@@ -310,7 +310,7 @@ public:
{
if (Player* player = ObjectAccessor::GetPlayer(*me, PlayerGUID))
{
- me->MonsterSay(NPCSAY_END, LANG_UNIVERSAL, NULL); //not blizzlike
+ me->Say(NPCSAY_END, LANG_UNIVERSAL); //not blizzlike
player->GroupEventHappens(QUEST_PYREWOOD_AMBUSH, me);
}
}
diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjalAI.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjalAI.cpp
index 9c9d3cb6a5f..a4745eade7d 100644
--- a/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjalAI.cpp
+++ b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjalAI.cpp
@@ -944,7 +944,7 @@ void hyjalAI::WaypointReached(uint32 waypointId)
{
if (waypointId == 1 || (waypointId == 0 && me->GetEntry() == THRALL))
{
- me->MonsterYell(YELL_HURRY, LANG_UNIVERSAL, NULL);
+ me->Yell(YELL_HURRY, LANG_UNIVERSAL);
WaitForTeleport = true;
TeleportTimer = 20000;
if (me->GetEntry() == JAINA)
diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/instance_hyjal.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/instance_hyjal.cpp
index 9cb75ec9807..55860d98cc5 100644
--- a/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/instance_hyjal.cpp
+++ b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/instance_hyjal.cpp
@@ -29,7 +29,6 @@ EndScriptData */
#include "hyjal_trash.h"
#include "Player.h"
#include "WorldPacket.h"
-#include "Opcodes.h"
#include "Chat.h"
/* Battle of Mount Hyjal encounters:
@@ -173,15 +172,12 @@ public:
for (Map::PlayerList::const_iterator i = PlayerList.begin(); i != PlayerList.end(); ++i)
{
- if (i->GetSource())
+ if (Player* player = i->GetSource())
{
WorldPacket packet;
- ChatHandler::BuildChatPacket(packet, CHAT_MSG_MONSTER_YELL, LANG_UNIVERSAL, unit, i->GetSource(), YELL_EFFORTS);
- i->GetSource()->GetSession()->SendPacket(&packet);
-
- WorldPacket data2(SMSG_PLAY_SOUND, 4);
- data2 << 10986;
- i->GetSource()->GetSession()->SendPacket(&data2);
+ ChatHandler::BuildChatPacket(packet, CHAT_MSG_MONSTER_YELL, LANG_UNIVERSAL, unit, player, YELL_EFFORTS);
+ player->SendDirectMessage(&packet);
+ player->PlayDirectSound(10986, player);
}
}
}
diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_mal_ganis.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_mal_ganis.cpp
index c78ae136b70..3f74ed2eb88 100644
--- a/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_mal_ganis.cpp
+++ b/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_mal_ganis.cpp
@@ -229,7 +229,7 @@ public:
void JustDied(Unit* /*killer*/) override
{
instance->SetBossState(DATA_MAL_GANIS, DONE);
- DoCastAOE(SPELL_MAL_GANIS_KILL_CREDIT);
+ DoCastAOE(SPELL_MAL_GANIS_KILL_CREDIT, true);
// give achievement credit and LFG rewards to players. criteria use spell 58630 which doesn't exist, but it was created in spell_dbc
DoCastAOE(SPELL_KILL_CREDIT);
}
diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_meathook.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_meathook.cpp
index 143f901ec0b..10ee66c86d0 100644
--- a/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_meathook.cpp
+++ b/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_meathook.cpp
@@ -70,6 +70,7 @@ class boss_meathook : public CreatureScript
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100.0f, true))
DoCast(target, SPELL_CONSTRICTING_CHAINS);
events.ScheduleEvent(EVENT_CHAIN, urand(2000, 4000));
+ break;
case EVENT_DISEASE:
DoCastAOE(SPELL_DISEASE_EXPULSION);
events.ScheduleEvent(EVENT_DISEASE, urand(1500, 4000));
diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_salramm_the_fleshcrafter.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_salramm_the_fleshcrafter.cpp
index 6925badf272..1d2ed933243 100644
--- a/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_salramm_the_fleshcrafter.cpp
+++ b/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_salramm_the_fleshcrafter.cpp
@@ -15,14 +15,6 @@
* with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-/* Script Data Start
-SDName: Boss salramm
-SDAuthor: Tartalo
-SD%Complete: 80
-SDComment: @todo Intro
-SDCategory:
-Script Data End */
-
#include "ScriptMgr.h"
#include "ScriptedCreature.h"
#include "culling_of_stratholme.h"
@@ -31,9 +23,7 @@ enum Spells
{
SPELL_CURSE_OF_TWISTED_FLESH = 58845,
SPELL_EXPLODE_GHOUL = 52480,
- H_SPELL_EXPLODE_GHOUL = 58825,
SPELL_SHADOW_BOLT = 57725,
- H_SPELL_SHADOW_BOLT = 58828,
SPELL_STEAL_FLESH = 52708,
SPELL_SUMMON_GHOULS = 52451
};
@@ -49,114 +39,89 @@ enum Yells
SAY_SUMMON_GHOULS = 6
};
-class boss_salramm : public CreatureScript
+enum Events
{
-public:
- boss_salramm() : CreatureScript("boss_salramm") { }
-
- CreatureAI* GetAI(Creature* creature) const override
- {
- return GetInstanceAI<boss_salrammAI>(creature);
- }
-
- struct boss_salrammAI : public ScriptedAI
- {
- boss_salrammAI(Creature* creature) : ScriptedAI(creature)
- {
- Initialize();
- instance = creature->GetInstanceScript();
- Talk(SAY_SPAWN);
- }
-
- void Initialize()
- {
- uiCurseFleshTimer = 30000; //30s DBM
- uiExplodeGhoulTimer = urand(25000, 28000); //approx 6 sec after summon ghouls
- uiShadowBoltTimer = urand(8000, 12000); // approx 10s
- uiStealFleshTimer = 12345;
- uiSummonGhoulsTimer = urand(19000, 24000); //on a video approx 24s after aggro
- }
-
- uint32 uiCurseFleshTimer;
- uint32 uiExplodeGhoulTimer;
- uint32 uiShadowBoltTimer;
- uint32 uiStealFleshTimer;
- uint32 uiSummonGhoulsTimer;
-
- InstanceScript* instance;
-
- void Reset() override
- {
- Initialize();
-
- instance->SetBossState(DATA_SALRAMM, NOT_STARTED);
- }
-
- void EnterCombat(Unit* /*who*/) override
- {
- Talk(SAY_AGGRO);
+ EVENT_CURSE_FLESH = 1,
+ EVENT_EXPLODE_GHOUL,
+ EVENT_SHADOW_BOLT,
+ EVENT_STEAL_FLESH,
+ EVENT_SUMMON_GHOULS
+};
- instance->SetBossState(DATA_SALRAMM, IN_PROGRESS);
- }
+class boss_salramm : public CreatureScript
+{
+ public:
+ boss_salramm() : CreatureScript("boss_salramm") { }
- void UpdateAI(uint32 diff) override
+ struct boss_salrammAI : public BossAI
{
- //Return since we have no target
- if (!UpdateVictim())
- return;
-
- //Curse of twisted flesh timer
- if (uiCurseFleshTimer <= diff)
+ boss_salrammAI(Creature* creature) : BossAI(creature, DATA_SALRAMM)
{
- DoCastVictim(SPELL_CURSE_OF_TWISTED_FLESH);
- uiCurseFleshTimer = 37000;
- } else uiCurseFleshTimer -= diff;
+ Talk(SAY_SPAWN);
+ }
- //Shadow bolt timer
- if (uiShadowBoltTimer <= diff)
+ void EnterCombat(Unit* /*who*/) override
{
- if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0))
- DoCast(target, SPELL_SHADOW_BOLT);
- uiShadowBoltTimer = urand(8000, 12000);
- } else uiShadowBoltTimer -= diff;
+ Talk(SAY_AGGRO);
+ _EnterCombat();
- //Steal Flesh timer
- if (uiStealFleshTimer <= diff)
- {
- Talk(SAY_STEAL_FLESH);
- if (Unit* random_pTarget = SelectTarget(SELECT_TARGET_RANDOM, 0))
- DoCast(random_pTarget, SPELL_STEAL_FLESH);
- uiStealFleshTimer = 10000;
- } else uiStealFleshTimer -= diff;
+ events.ScheduleEvent(EVENT_CURSE_FLESH, 30000);
+ events.ScheduleEvent(EVENT_SUMMON_GHOULS, urand(19000, 24000));
+ events.ScheduleEvent(EVENT_SHADOW_BOLT, urand(8000, 12000));
+ events.ScheduleEvent(EVENT_STEAL_FLESH, 12345); /// @todo: adjust timer
+ }
- //Summon ghouls timer
- if (uiSummonGhoulsTimer <= diff)
+ void ExecuteEvent(uint32 eventId) override
{
- Talk(SAY_SUMMON_GHOULS);
- if (Unit* random_pTarget = SelectTarget(SELECT_TARGET_RANDOM, 0))
- DoCast(random_pTarget, SPELL_SUMMON_GHOULS);
- uiSummonGhoulsTimer = 10000;
- } else uiSummonGhoulsTimer -= diff;
-
- DoMeleeAttackIfReady();
- }
-
- void JustDied(Unit* /*killer*/) override
- {
- Talk(SAY_DEATH);
+ switch (eventId)
+ {
+ case EVENT_CURSE_FLESH:
+ DoCastVictim(SPELL_CURSE_OF_TWISTED_FLESH);
+ events.ScheduleEvent(EVENT_CURSE_FLESH, 37000);
+ break;
+ case EVENT_SUMMON_GHOULS:
+ Talk(SAY_SUMMON_GHOULS);
+ DoCast(me, SPELL_SUMMON_GHOULS);
+ events.ScheduleEvent(EVENT_SUMMON_GHOULS, 10000);
+ events.ScheduleEvent(EVENT_EXPLODE_GHOUL, 6000);
+ break;
+ case EVENT_SHADOW_BOLT:
+ if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 40.0f, true))
+ DoCast(target, SPELL_SHADOW_BOLT);
+ events.ScheduleEvent(EVENT_SHADOW_BOLT, urand(8000, 12000));
+ break;
+ case EVENT_STEAL_FLESH:
+ Talk(SAY_STEAL_FLESH);
+ if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 50.0f, true))
+ DoCast(target, SPELL_STEAL_FLESH);
+ events.ScheduleEvent(EVENT_STEAL_FLESH, 12345);
+ break;
+ case EVENT_EXPLODE_GHOUL:
+ Talk(SAY_EXPLODE_GHOUL);
+ DoCast(me, SPELL_EXPLODE_GHOUL, true);
+ break;
+ default:
+ break;
+ }
+ }
+
+ void JustDied(Unit* /*killer*/) override
+ {
+ Talk(SAY_DEATH);
+ _JustDied();
+ }
- instance->SetBossState(DATA_SALRAMM, DONE);
- }
+ void KilledUnit(Unit* victim) override
+ {
+ if (victim->GetTypeId() == TYPEID_PLAYER)
+ Talk(SAY_SLAY);
+ }
+ };
- void KilledUnit(Unit* victim) override
+ CreatureAI* GetAI(Creature* creature) const override
{
- if (victim->GetTypeId() != TYPEID_PLAYER)
- return;
-
- Talk(SAY_SLAY);
+ return GetInstanceAI<boss_salrammAI>(creature);
}
- };
-
};
void AddSC_boss_salramm()
diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/instance_culling_of_stratholme.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/instance_culling_of_stratholme.cpp
index e20e976b4b9..ae0fa2aa564 100644
--- a/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/instance_culling_of_stratholme.cpp
+++ b/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/instance_culling_of_stratholme.cpp
@@ -63,6 +63,7 @@ class instance_culling_of_stratholme : public InstanceMapScript
_crateCount = 0;
_eventTimer = 0;
+ _infiniteCouterState = NOT_STARTED;
}
void FillInitialWorldStates(WorldPacket& data) override
diff --git a/src/server/scripts/Kalimdor/OnyxiasLair/boss_onyxia.cpp b/src/server/scripts/Kalimdor/OnyxiasLair/boss_onyxia.cpp
index eec2a590bd4..5c083e43d3d 100644
--- a/src/server/scripts/Kalimdor/OnyxiasLair/boss_onyxia.cpp
+++ b/src/server/scripts/Kalimdor/OnyxiasLair/boss_onyxia.cpp
@@ -153,7 +153,7 @@ public:
SetCombatMovement(true);
_Reset();
-
+ me->SetReactState(REACT_AGGRESSIVE);
instance->SetData(DATA_ONYXIA_PHASE, Phase);
instance->DoStopTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEV_TIMED_START_EVENT);
}
@@ -162,12 +162,10 @@ public:
{
_EnterCombat();
Talk(SAY_AGGRO);
-
events.ScheduleEvent(EVENT_FLAME_BREATH, urand(10000, 20000));
events.ScheduleEvent(EVENT_TAIL_SWEEP, urand(15000, 20000));
events.ScheduleEvent(EVENT_CLEAVE, urand(2000, 5000));
events.ScheduleEvent(EVENT_WING_BUFFET, urand(10000, 20000));
-
instance->DoStartTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEV_TIMED_START_EVENT);
}
@@ -331,9 +329,10 @@ public:
{
if (HealthBelowPct(65))
{
+ if (Unit* target = me->GetVictim())
+ tankGUID = target->GetGUID();
SetCombatMovement(false);
Phase = PHASE_BREATH;
- tankGUID = me->GetVictim()->GetGUID();
me->SetReactState(REACT_PASSIVE);
me->AttackStop();
me->GetMotionMaster()->MovePoint(10, Phase2Location);
diff --git a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/instance_trial_of_the_crusader.cpp b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/instance_trial_of_the_crusader.cpp
index 9839eb3d952..30d831da30c 100644
--- a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/instance_trial_of_the_crusader.cpp
+++ b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/instance_trial_of_the_crusader.cpp
@@ -150,6 +150,7 @@ class instance_trial_of_the_crusader : public InstanceMapScript
break;
case NPC_ANUBARAK:
AnubarakGUID = creature->GetGUID();
+ creature->SetRespawnDelay(7 * DAY);
break;
default:
break;
diff --git a/src/server/scripts/Northrend/Naxxramas/boss_gluth.cpp b/src/server/scripts/Northrend/Naxxramas/boss_gluth.cpp
index cea4b540f7b..e98e74634e2 100644
--- a/src/server/scripts/Northrend/Naxxramas/boss_gluth.cpp
+++ b/src/server/scripts/Northrend/Naxxramas/boss_gluth.cpp
@@ -75,7 +75,7 @@ public:
{
SetGazeOn(who);
/// @todo use a script text
- me->MonsterTextEmote(EMOTE_NEARBY, NULL, true);
+ me->TextEmote(EMOTE_NEARBY, nullptr, true);
}
else
BossAI::MoveInLineOfSight(who);
diff --git a/src/server/scripts/Northrend/Naxxramas/boss_maexxna.cpp b/src/server/scripts/Northrend/Naxxramas/boss_maexxna.cpp
index 10b74ca938d..aa284f1aaee 100644
--- a/src/server/scripts/Northrend/Naxxramas/boss_maexxna.cpp
+++ b/src/server/scripts/Northrend/Naxxramas/boss_maexxna.cpp
@@ -66,14 +66,22 @@ public:
struct boss_maexxnaAI : public BossAI
{
- boss_maexxnaAI(Creature* creature) : BossAI(creature, BOSS_MAEXXNA) { }
+ boss_maexxnaAI(Creature* creature) : BossAI(creature, BOSS_MAEXXNA)
+ {
+ Initialize();
+ }
+
+ void Initialize()
+ {
+ enraged = false;
+ }
bool enraged;
void EnterCombat(Unit* /*who*/) override
{
_EnterCombat();
- enraged = false;
+ Initialize();
events.ScheduleEvent(EVENT_WRAP, 20000);
events.ScheduleEvent(EVENT_SPRAY, 40000);
events.ScheduleEvent(EVENT_SHOCK, urand(5000, 10000));
diff --git a/src/server/scripts/Northrend/Naxxramas/boss_noth.cpp b/src/server/scripts/Northrend/Naxxramas/boss_noth.cpp
index 94117e9dbbf..0e07ff027f6 100644
--- a/src/server/scripts/Northrend/Naxxramas/boss_noth.cpp
+++ b/src/server/scripts/Northrend/Naxxramas/boss_noth.cpp
@@ -72,7 +72,11 @@ public:
struct boss_nothAI : public BossAI
{
- boss_nothAI(Creature* creature) : BossAI(creature, BOSS_NOTH) { }
+ boss_nothAI(Creature* creature) : BossAI(creature, BOSS_NOTH)
+ {
+ balconyCount = 0;
+ waveCount = 0;
+ }
void Reset() override
{
diff --git a/src/server/scripts/Northrend/Naxxramas/boss_patchwerk.cpp b/src/server/scripts/Northrend/Naxxramas/boss_patchwerk.cpp
index 3e8a54f7cec..116cee5f275 100644
--- a/src/server/scripts/Northrend/Naxxramas/boss_patchwerk.cpp
+++ b/src/server/scripts/Northrend/Naxxramas/boss_patchwerk.cpp
@@ -61,7 +61,10 @@ public:
struct boss_patchwerkAI : public BossAI
{
- boss_patchwerkAI(Creature* creature) : BossAI(creature, BOSS_PATCHWERK) { }
+ boss_patchwerkAI(Creature* creature) : BossAI(creature, BOSS_PATCHWERK)
+ {
+ Enraged = false;
+ }
bool Enraged;
diff --git a/src/server/scripts/Northrend/Naxxramas/boss_sapphiron.cpp b/src/server/scripts/Northrend/Naxxramas/boss_sapphiron.cpp
index ec38332613d..97c7d7c4052 100644
--- a/src/server/scripts/Northrend/Naxxramas/boss_sapphiron.cpp
+++ b/src/server/scripts/Northrend/Naxxramas/boss_sapphiron.cpp
@@ -90,9 +90,19 @@ class boss_sapphiron : public CreatureScript
struct boss_sapphironAI : public BossAI
{
boss_sapphironAI(Creature* creature) :
- BossAI(creature, BOSS_SAPPHIRON), _phase(PHASE_NULL),
- _map(me->GetMap())
- { }
+ BossAI(creature, BOSS_SAPPHIRON), _map(me->GetMap())
+ {
+ Initialize();
+ _iceboltCount = 0;
+ }
+
+ void Initialize()
+ {
+ _phase = PHASE_NULL;
+
+ _canTheHundredClub = true;
+ _checkFrostResistTimer = 5 * IN_MILLISECONDS;
+ }
void InitializeAI() override
{
@@ -115,10 +125,7 @@ class boss_sapphiron : public CreatureScript
if (_phase == PHASE_FLIGHT)
ClearIceBlock();
- _phase = PHASE_NULL;
-
- _canTheHundredClub = true;
- _checkFrostResistTimer = 5 * IN_MILLISECONDS;
+ Initialize();
}
void EnterCombat(Unit* /*who*/) override
diff --git a/src/server/scripts/Northrend/Naxxramas/boss_thaddius.cpp b/src/server/scripts/Northrend/Naxxramas/boss_thaddius.cpp
index 32c7fa048dc..650777a8815 100644
--- a/src/server/scripts/Northrend/Naxxramas/boss_thaddius.cpp
+++ b/src/server/scripts/Northrend/Naxxramas/boss_thaddius.cpp
@@ -137,6 +137,9 @@ public:
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC | UNIT_FLAG_NOT_SELECTABLE | UNIT_FLAG_STUNNED);
me->SetReactState(REACT_PASSIVE);
}
+
+ polaritySwitch = false;
+ uiAddsTimer = 0;
}
bool checkStalaggAlive;
@@ -287,9 +290,16 @@ public:
{
npc_stalaggAI(Creature* creature) : ScriptedAI(creature)
{
+ Initialize();
instance = creature->GetInstanceScript();
}
+ void Initialize()
+ {
+ powerSurgeTimer = urand(20000, 25000);
+ magneticPullTimer = 20000;
+ }
+
InstanceScript* instance;
uint32 powerSurgeTimer;
@@ -300,8 +310,7 @@ public:
if (Creature* pThaddius = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_THADDIUS)))
if (pThaddius->AI())
pThaddius->AI()->DoAction(ACTION_STALAGG_RESET);
- powerSurgeTimer = urand(20000, 25000);
- magneticPullTimer = 20000;
+ Initialize();
}
void KilledUnit(Unit* /*victim*/) override
@@ -379,9 +388,15 @@ public:
{
npc_feugenAI(Creature* creature) : ScriptedAI(creature)
{
+ Initialize();
instance = creature->GetInstanceScript();
}
+ void Initialize()
+ {
+ staticFieldTimer = 5000;
+ }
+
InstanceScript* instance;
uint32 staticFieldTimer;
@@ -391,7 +406,7 @@ public:
if (Creature* pThaddius = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_THADDIUS)))
if (pThaddius->AI())
pThaddius->AI()->DoAction(ACTION_FEUGEN_RESET);
- staticFieldTimer = 5000;
+ Initialize();
}
void KilledUnit(Unit* /*victim*/) override
diff --git a/src/server/scripts/Northrend/Naxxramas/instance_naxxramas.cpp b/src/server/scripts/Northrend/Naxxramas/instance_naxxramas.cpp
index 6dcdd05048a..4151c4a85a7 100644
--- a/src/server/scripts/Northrend/Naxxramas/instance_naxxramas.cpp
+++ b/src/server/scripts/Northrend/Naxxramas/instance_naxxramas.cpp
@@ -112,6 +112,10 @@ class instance_naxxramas : public InstanceMapScript
LoadDoorData(doorData);
LoadMinionData(minionData);
+ minHorsemenDiedTime = 0;
+ maxHorsemenDiedTime = 0;
+ AbominationCount = 0;
+
playerDied = 0;
}
@@ -430,7 +434,6 @@ class instance_naxxramas : public InstanceMapScript
ObjectGuid BaronGUID;
ObjectGuid SirGUID;
ObjectGuid HorsemenChestGUID;
- ObjectGuid HorsemenTeleporterGUID;
time_t minHorsemenDiedTime;
time_t maxHorsemenDiedTime;
diff --git a/src/server/scripts/Northrend/Nexus/EyeOfEternity/boss_malygos.cpp b/src/server/scripts/Northrend/Nexus/EyeOfEternity/boss_malygos.cpp
index 856a16fd4dd..5862453731e 100644
--- a/src/server/scripts/Northrend/Nexus/EyeOfEternity/boss_malygos.cpp
+++ b/src/server/scripts/Northrend/Nexus/EyeOfEternity/boss_malygos.cpp
@@ -342,16 +342,13 @@ public:
{
boss_malygosAI(Creature* creature) : BossAI(creature, DATA_MALYGOS_EVENT)
{
+ Initialize();
_despawned = false; // We determine if Malygos will be realocated to spawning position on reset triggered by boss despawn on evade
_flySpeed = me->GetSpeed(MOVE_FLIGHT); // Get initial fly speed, otherwise on each wipe fly speed would add up if we get it
}
- void Reset() override
+ void Initialize()
{
- // EnterEvadeMode and Reset() links are cut for the sake of properly functioning despawner.
- if (!_despawned)
- _Reset();
-
_summonDeaths = 0;
_preparingPulsesChecker = 0;
_arcaneOverloadGUID.Clear();
@@ -367,6 +364,15 @@ public:
_firstCyclicMovementStarted = false;
_performingSurgeOfPower = false;
_performingDestroyPlatform = false;
+ }
+
+ void Reset() override
+ {
+ // EnterEvadeMode and Reset() links are cut for the sake of properly functioning despawner.
+ if (!_despawned)
+ _Reset();
+
+ Initialize();
me->SetDisableGravity(true);
me->SetByteFlag(UNIT_FIELD_BYTES_1, 3, UNIT_BYTE1_FLAG_ALWAYS_STAND | UNIT_BYTE1_FLAG_HOVER);
@@ -1175,17 +1181,23 @@ public:
{
npc_melee_hover_diskAI(Creature* creature) : VehicleAI(creature)
{
+ Initialize();
_instance = creature->GetInstanceScript();
me->SetReactState(REACT_PASSIVE);
// TO DO: These were a bit faster than what they should be. Not sure what is the reason.
me->SetSpeed(MOVE_FLIGHT, 1.25f);
}
+ void Initialize()
+ {
+ _wpCount = 0;
+ }
+
void Reset() override
{
VehicleAI::Reset();
- _wpCount = 0;
+ Initialize();
}
void PassengerBoarded(Unit* unit, int8 /*seat*/, bool apply) override
@@ -1509,10 +1521,7 @@ public:
void IsSummonedBy(Unit* summoner) override
{
if (Creature* creature = summoner->ToCreature())
- {
- _malygos = creature;
- _malygos->AI()->SetGUID(me->GetGUID(), DATA_LAST_OVERLOAD_GUID);
- }
+ creature->AI()->SetGUID(me->GetGUID(), DATA_LAST_OVERLOAD_GUID);
}
void UpdateAI(uint32 /*diff*/)
@@ -1541,7 +1550,6 @@ public:
}
private:
- Creature* _malygos;
InstanceScript* _instance;
};
@@ -1561,6 +1569,7 @@ public:
{
npc_wyrmrest_skytalonAI(Creature* creature) : VehicleAI(creature)
{
+ _summoner = NULL;
}
void IsSummonedBy(Unit* summoner) override
diff --git a/src/server/scripts/Northrend/Nexus/Nexus/boss_anomalus.cpp b/src/server/scripts/Northrend/Nexus/Nexus/boss_anomalus.cpp
index fde19c124bf..ed08296acd8 100644
--- a/src/server/scripts/Northrend/Nexus/Nexus/boss_anomalus.cpp
+++ b/src/server/scripts/Northrend/Nexus/Nexus/boss_anomalus.cpp
@@ -77,23 +77,28 @@ class boss_anomalus : public CreatureScript
{
boss_anomalusAI(Creature* creature) : ScriptedAI(creature)
{
+ Initialize();
instance = me->GetInstanceScript();
}
+ void Initialize()
+ {
+ Phase = 0;
+ uiSparkTimer = 5000;
+ uiChaoticRiftGUID.Clear();
+ chaosTheory = true;
+ }
+
InstanceScript* instance;
uint8 Phase;
uint32 uiSparkTimer;
- uint32 uiCreateRiftTimer;
ObjectGuid uiChaoticRiftGUID;
bool chaosTheory;
void Reset() override
{
- Phase = 0;
- uiSparkTimer = 5000;
- uiChaoticRiftGUID.Clear();
- chaosTheory = true;
+ Initialize();
instance->SetData(DATA_ANOMALUS_EVENT, NOT_STARTED);
}
@@ -197,10 +202,17 @@ class npc_chaotic_rift : public CreatureScript
{
npc_chaotic_riftAI(Creature* creature) : ScriptedAI(creature)
{
+ Initialize();
instance = me->GetInstanceScript();
SetCombatMovement(false);
}
+ void Initialize()
+ {
+ uiChaoticEnergyBurstTimer = 1000;
+ uiSummonCrazedManaWraithTimer = 5000;
+ }
+
InstanceScript* instance;
uint32 uiChaoticEnergyBurstTimer;
@@ -208,8 +220,7 @@ class npc_chaotic_rift : public CreatureScript
void Reset() override
{
- uiChaoticEnergyBurstTimer = 1000;
- uiSummonCrazedManaWraithTimer = 5000;
+ Initialize();
me->SetDisplayId(me->GetCreatureTemplate()->Modelid2);
DoCast(me, SPELL_ARCANEFORM, false);
}
diff --git a/src/server/scripts/Northrend/Nexus/Nexus/boss_keristrasza.cpp b/src/server/scripts/Northrend/Nexus/Nexus/boss_keristrasza.cpp
index d6afab7c3fd..6b3df5ef665 100644
--- a/src/server/scripts/Northrend/Nexus/Nexus/boss_keristrasza.cpp
+++ b/src/server/scripts/Northrend/Nexus/Nexus/boss_keristrasza.cpp
@@ -68,9 +68,20 @@ public:
{
boss_keristraszaAI(Creature* creature) : ScriptedAI(creature)
{
+ Initialize();
instance = creature->GetInstanceScript();
}
+ void Initialize()
+ {
+ uiCrystalfireBreathTimer = 14 * IN_MILLISECONDS;
+ uiCrystalChainsCrystalizeTimer = DUNGEON_MODE(30 * IN_MILLISECONDS, 11 * IN_MILLISECONDS);
+ uiTailSweepTimer = 5 * IN_MILLISECONDS;
+ bEnrage = false;
+
+ intenseCold = true;
+ }
+
InstanceScript* instance;
GuidList intenseColdList;
@@ -83,12 +94,7 @@ public:
void Reset() override
{
- uiCrystalfireBreathTimer = 14*IN_MILLISECONDS;
- uiCrystalChainsCrystalizeTimer = DUNGEON_MODE(30*IN_MILLISECONDS, 11*IN_MILLISECONDS);
- uiTailSweepTimer = 5*IN_MILLISECONDS;
- bEnrage = false;
-
- intenseCold = true;
+ Initialize();
intenseColdList.clear();
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_STUNNED);
diff --git a/src/server/scripts/Northrend/Nexus/Nexus/boss_magus_telestra.cpp b/src/server/scripts/Northrend/Nexus/Nexus/boss_magus_telestra.cpp
index 6f42237e34a..8c58a65cdbe 100644
--- a/src/server/scripts/Northrend/Nexus/Nexus/boss_magus_telestra.cpp
+++ b/src/server/scripts/Northrend/Nexus/Nexus/boss_magus_telestra.cpp
@@ -72,7 +72,32 @@ public:
{
boss_magus_telestraAI(Creature* creature) : ScriptedAI(creature)
{
+ Initialize();
instance = creature->GetInstanceScript();
+ bFireMagusDead = false;
+ bFrostMagusDead = false;
+ bArcaneMagusDead = false;
+ uiIsWaitingToAppearTimer = 0;
+ }
+
+ void Initialize()
+ {
+ Phase = 0;
+ //These times are probably wrong
+ uiIceNovaTimer = 7 * IN_MILLISECONDS;
+ uiFireBombTimer = 0;
+ uiGravityWellTimer = 15 * IN_MILLISECONDS;
+ uiCooldown = 0;
+
+ uiFireMagusGUID.Clear();
+ uiFrostMagusGUID.Clear();
+ uiArcaneMagusGUID.Clear();
+
+ for (uint8 n = 0; n < 3; ++n)
+ time[n] = 0;
+
+ splitPersonality = 0;
+ bIsWaitingToAppear = false;
}
InstanceScript* instance;
@@ -98,22 +123,7 @@ public:
void Reset() override
{
- Phase = 0;
- //These times are probably wrong
- uiIceNovaTimer = 7*IN_MILLISECONDS;
- uiFireBombTimer = 0;
- uiGravityWellTimer = 15*IN_MILLISECONDS;
- uiCooldown = 0;
-
- uiFireMagusGUID.Clear();
- uiFrostMagusGUID.Clear();
- uiArcaneMagusGUID.Clear();
-
- for (uint8 n = 0; n < 3; ++n)
- time[n] = 0;
-
- splitPersonality = 0;
- bIsWaitingToAppear = false;
+ Initialize();
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
me->SetVisible(true);
diff --git a/src/server/scripts/Northrend/Nexus/Nexus/boss_ormorok.cpp b/src/server/scripts/Northrend/Nexus/Nexus/boss_ormorok.cpp
index 222f0474c01..84523c1864d 100644
--- a/src/server/scripts/Northrend/Nexus/Nexus/boss_ormorok.cpp
+++ b/src/server/scripts/Northrend/Nexus/Nexus/boss_ormorok.cpp
@@ -68,12 +68,20 @@ public:
struct boss_ormorokAI : public BossAI
{
- boss_ormorokAI(Creature* creature) : BossAI(creature, DATA_ORMOROK_EVENT) { }
+ boss_ormorokAI(Creature* creature) : BossAI(creature, DATA_ORMOROK_EVENT)
+ {
+ Initialize();
+ }
+
+ void Initialize()
+ {
+ frenzy = false;
+ }
void Reset()
{
BossAI::Reset();
- frenzy = false;
+ Initialize();
}
void EnterCombat(Unit* /*who*/) override
diff --git a/src/server/scripts/Northrend/Nexus/Oculus/boss_drakos.cpp b/src/server/scripts/Northrend/Nexus/Oculus/boss_drakos.cpp
index 3539661ea19..ea23041da6f 100644
--- a/src/server/scripts/Northrend/Nexus/Oculus/boss_drakos.cpp
+++ b/src/server/scripts/Northrend/Nexus/Oculus/boss_drakos.cpp
@@ -57,7 +57,15 @@ class boss_drakos : public CreatureScript
struct boss_drakosAI : public BossAI
{
- boss_drakosAI(Creature* creature) : BossAI(creature, DATA_DRAKOS) { }
+ boss_drakosAI(Creature* creature) : BossAI(creature, DATA_DRAKOS)
+ {
+ Initialize();
+ }
+
+ void Initialize()
+ {
+ postPull = false;
+ }
void Reset() override
{
@@ -67,7 +75,7 @@ class boss_drakos : public CreatureScript
events.ScheduleEvent(EVENT_STOMP, 17000);
events.ScheduleEvent(EVENT_BOMB_SUMMON, 2000);
- postPull = false;
+ Initialize();
}
void EnterCombat(Unit* /*who*/) override
@@ -150,7 +158,15 @@ class npc_unstable_sphere : public CreatureScript
struct npc_unstable_sphereAI : public ScriptedAI
{
- npc_unstable_sphereAI(Creature* creature) : ScriptedAI(creature) { }
+ npc_unstable_sphereAI(Creature* creature) : ScriptedAI(creature)
+ {
+ Initialize();
+ }
+
+ void Initialize()
+ {
+ pulseTimer = 3000;
+ }
void Reset() override
{
@@ -160,7 +176,7 @@ class npc_unstable_sphere : public CreatureScript
me->AddAura(SPELL_UNSTABLE_SPHERE_PASSIVE, me);
me->AddAura(SPELL_UNSTABLE_SPHERE_TIMER, me);
- pulseTimer = 3000;
+ Initialize();
me->DespawnOrUnsummon(19000);
}
diff --git a/src/server/scripts/Northrend/Nexus/Oculus/boss_eregos.cpp b/src/server/scripts/Northrend/Nexus/Oculus/boss_eregos.cpp
index 3ae61bdd116..0dc05cb450d 100644
--- a/src/server/scripts/Northrend/Nexus/Oculus/boss_eregos.cpp
+++ b/src/server/scripts/Northrend/Nexus/Oculus/boss_eregos.cpp
@@ -85,16 +85,24 @@ class boss_eregos : public CreatureScript
struct boss_eregosAI : public BossAI
{
- boss_eregosAI(Creature* creature) : BossAI(creature, DATA_EREGOS) { }
+ boss_eregosAI(Creature* creature) : BossAI(creature, DATA_EREGOS)
+ {
+ Initialize();
+ }
- void Reset() override
+ void Initialize()
{
- _Reset();
_phase = PHASE_NORMAL;
_rubyVoid = true;
_emeraldVoid = true;
_amberVoid = true;
+ }
+
+ void Reset() override
+ {
+ _Reset();
+ Initialize();
DoAction(ACTION_SET_NORMAL_EVENTS);
}
diff --git a/src/server/scripts/Northrend/Nexus/Oculus/boss_urom.cpp b/src/server/scripts/Northrend/Nexus/Oculus/boss_urom.cpp
index c4e0986edd4..9dddf721d53 100644
--- a/src/server/scripts/Northrend/Nexus/Oculus/boss_urom.cpp
+++ b/src/server/scripts/Northrend/Nexus/Oculus/boss_urom.cpp
@@ -95,6 +95,7 @@ class boss_urom : public CreatureScript
{
boss_uromAI(Creature* creature) : BossAI(creature, DATA_UROM)
{
+ Initialize();
platform = 0;
for (uint8 i = 0; i < 3; ++i)
@@ -103,19 +104,13 @@ class boss_urom : public CreatureScript
std::random_shuffle(group, group + 3);
}
- void Reset() override
+ void Initialize()
{
- me->CastSpell(me, SPELL_EVOCATE);
-
- _Reset();
-
x = 0.0f;
y = 0.0f;
canCast = false;
canGoBack = false;
- me->GetMotionMaster()->MoveIdle();
-
teleportTimer = urand(30000, 35000);
arcaneExplosionTimer = 9000;
castArcaneExplosionTimer = 2000;
@@ -123,6 +118,15 @@ class boss_urom : public CreatureScript
timeBombTimer = urand(20000, 25000);
}
+ void Reset() override
+ {
+ me->CastSpell(me, SPELL_EVOCATE);
+
+ _Reset();
+
+ me->GetMotionMaster()->MoveIdle();
+ }
+
void EnterCombat(Unit* /*who*/) override
{
_EnterCombat();
diff --git a/src/server/scripts/Northrend/Nexus/Oculus/boss_varos.cpp b/src/server/scripts/Northrend/Nexus/Oculus/boss_varos.cpp
index 70371e17074..0119b81796e 100644
--- a/src/server/scripts/Northrend/Nexus/Oculus/boss_varos.cpp
+++ b/src/server/scripts/Northrend/Nexus/Oculus/boss_varos.cpp
@@ -59,7 +59,16 @@ class boss_varos : public CreatureScript
struct boss_varosAI : public BossAI
{
- boss_varosAI(Creature* creature) : BossAI(creature, DATA_VAROS) { }
+ boss_varosAI(Creature* creature) : BossAI(creature, DATA_VAROS)
+ {
+ Initialize();
+ }
+
+ void Initialize()
+ {
+ firstCoreEnergize = false;
+ coreEnergizeOrientation = 0.0f;
+ }
void InitializeAI() override
{
@@ -77,8 +86,7 @@ class boss_varos : public CreatureScript
// not sure if this is handled by a timer or hp percentage
events.ScheduleEvent(EVENT_CALL_AZURE, urand(15, 30) * IN_MILLISECONDS);
- firstCoreEnergize = false;
- coreEnergizeOrientation = 0.0f;
+ Initialize();
}
void EnterCombat(Unit* /*who*/) override
@@ -170,12 +178,18 @@ class npc_azure_ring_captain : public CreatureScript
{
npc_azure_ring_captainAI(Creature* creature) : ScriptedAI(creature)
{
+ Initialize();
instance = creature->GetInstanceScript();
}
- void Reset() override
+ void Initialize()
{
targetGUID.Clear();
+ }
+
+ void Reset() override
+ {
+ Initialize();
me->SetWalk(true);
//! HACK: Creature's can't have MOVEMENTFLAG_FLYING
diff --git a/src/server/scripts/Northrend/Nexus/Oculus/oculus.cpp b/src/server/scripts/Northrend/Nexus/Oculus/oculus.cpp
index 259d7faa6fe..8a0921b604b 100644
--- a/src/server/scripts/Northrend/Nexus/Oculus/oculus.cpp
+++ b/src/server/scripts/Northrend/Nexus/Oculus/oculus.cpp
@@ -232,13 +232,19 @@ class npc_ruby_emerald_amber_drake : public CreatureScript
{
npc_ruby_emerald_amber_drakeAI(Creature* creature) : VehicleAI(creature)
{
+ Initialize();
_instance = creature->GetInstanceScript();
}
+ void Initialize()
+ {
+ _healthWarning = true;
+ }
+
void Reset() override
{
_events.Reset();
- _healthWarning = true;
+ Initialize();
}
void IsSummonedBy(Unit* summoner) override
diff --git a/src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_bjarngrim.cpp b/src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_bjarngrim.cpp
index b4a95239df2..b5079d8cf4f 100644
--- a/src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_bjarngrim.cpp
+++ b/src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_bjarngrim.cpp
@@ -106,11 +106,34 @@ public:
{
boss_bjarngrimAI(Creature* creature) : ScriptedAI(creature)
{
+ Initialize();
instance = creature->GetInstanceScript();
m_uiStance = STANCE_DEFENSIVE;
canBuff = true;
}
+ void Initialize()
+ {
+ m_bIsChangingStance = false;
+
+ m_uiChargingStatus = 0;
+ m_uiCharge_Timer = 1000;
+
+ m_uiChangeStance_Timer = urand(20000, 25000);
+
+ m_uiReflection_Timer = 8000;
+ m_uiKnockAway_Timer = 20000;
+ m_uiPummel_Timer = 10000;
+ m_uiIronform_Timer = 25000;
+
+ m_uiIntercept_Timer = 5000;
+ m_uiWhirlwind_Timer = 10000;
+ m_uiCleave_Timer = 8000;
+
+ m_uiMortalStrike_Timer = 8000;
+ m_uiSlam_Timer = 10000;
+ }
+
InstanceScript* instance;
bool m_bIsChangingStance;
@@ -142,24 +165,7 @@ public:
if (!me->HasAura(SPELL_TEMPORARY_ELECTRICAL_CHARGE))
me->AddAura(SPELL_TEMPORARY_ELECTRICAL_CHARGE, me);
- m_bIsChangingStance = false;
-
- m_uiChargingStatus = 0;
- m_uiCharge_Timer = 1000;
-
- m_uiChangeStance_Timer = urand(20000, 25000);
-
- m_uiReflection_Timer = 8000;
- m_uiKnockAway_Timer = 20000;
- m_uiPummel_Timer = 10000;
- m_uiIronform_Timer = 25000;
-
- m_uiIntercept_Timer = 5000;
- m_uiWhirlwind_Timer = 10000;
- m_uiCleave_Timer = 8000;
-
- m_uiMortalStrike_Timer = 8000;
- m_uiSlam_Timer = 10000;
+ Initialize();
for (uint8 i = 0; i < 2; ++i)
{
@@ -393,9 +399,16 @@ public:
{
npc_stormforged_lieutenantAI(Creature* creature) : ScriptedAI(creature)
{
+ Initialize();
instance = creature->GetInstanceScript();
}
+ void Initialize()
+ {
+ m_uiArcWeld_Timer = urand(20000, 21000);
+ m_uiRenewSteel_Timer = urand(10000, 11000);
+ }
+
InstanceScript* instance;
uint32 m_uiArcWeld_Timer;
@@ -403,8 +416,7 @@ public:
void Reset() override
{
- m_uiArcWeld_Timer = urand(20000, 21000);
- m_uiRenewSteel_Timer = urand(10000, 11000);
+ Initialize();
}
void EnterCombat(Unit* who) override
diff --git a/src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_ionar.cpp b/src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_ionar.cpp
index 932a8e7b691..274fbed0fc9 100644
--- a/src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_ionar.cpp
+++ b/src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_ionar.cpp
@@ -76,9 +76,23 @@ public:
{
boss_ionarAI(Creature* creature) : ScriptedAI(creature), lSparkList(creature)
{
+ Initialize();
instance = creature->GetInstanceScript();
}
+ void Initialize()
+ {
+ bIsSplitPhase = true;
+ bHasDispersed = false;
+
+ uiSplitTimer = 25 * IN_MILLISECONDS;
+
+ uiStaticOverloadTimer = urand(5 * IN_MILLISECONDS, 6 * IN_MILLISECONDS);
+ uiBallLightningTimer = urand(10 * IN_MILLISECONDS, 11 * IN_MILLISECONDS);
+
+ uiDisperseHealth = 45 + urand(0, 10);
+ }
+
InstanceScript* instance;
SummonList lSparkList;
@@ -97,15 +111,7 @@ public:
{
lSparkList.DespawnAll();
- bIsSplitPhase = true;
- bHasDispersed = false;
-
- uiSplitTimer = 25*IN_MILLISECONDS;
-
- uiStaticOverloadTimer = urand(5*IN_MILLISECONDS, 6*IN_MILLISECONDS);
- uiBallLightningTimer = urand(10*IN_MILLISECONDS, 11*IN_MILLISECONDS);
-
- uiDisperseHealth = 45 + urand(0, 10);
+ Initialize();
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE|UNIT_FLAG_NOT_SELECTABLE|UNIT_FLAG_DISABLE_MOVE);
@@ -297,16 +303,22 @@ public:
{
npc_spark_of_ionarAI(Creature* creature) : ScriptedAI(creature)
{
+ Initialize();
instance = creature->GetInstanceScript();
}
+ void Initialize()
+ {
+ uiCheckTimer = 2 * IN_MILLISECONDS;
+ }
+
InstanceScript* instance;
uint32 uiCheckTimer;
void Reset() override
{
- uiCheckTimer = 2*IN_MILLISECONDS;
+ Initialize();
me->SetReactState(REACT_PASSIVE);
}
diff --git a/src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_loken.cpp b/src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_loken.cpp
index 98d7d629756..fc29369c28f 100644
--- a/src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_loken.cpp
+++ b/src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_loken.cpp
@@ -74,9 +74,19 @@ public:
{
boss_lokenAI(Creature* creature) : ScriptedAI(creature)
{
+ Initialize();
instance = creature->GetInstanceScript();
}
+ void Initialize()
+ {
+ m_uiArcLightning_Timer = 15000;
+ m_uiLightningNova_Timer = 20000;
+ m_uiResumePulsingShockwave_Timer = 1000;
+
+ m_uiHealthAmountModifier = 1;
+ }
+
InstanceScript* instance;
uint32 m_uiArcLightning_Timer;
@@ -87,11 +97,7 @@ public:
void Reset() override
{
- m_uiArcLightning_Timer = 15000;
- m_uiLightningNova_Timer = 20000;
- m_uiResumePulsingShockwave_Timer = 1000;
-
- m_uiHealthAmountModifier = 1;
+ Initialize();
instance->SetBossState(DATA_LOKEN, NOT_STARTED);
instance->DoStopTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEV_TIMELY_DEATH_START_EVENT);
diff --git a/src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_volkhan.cpp b/src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_volkhan.cpp
index c377de38372..d63d5e87923 100644
--- a/src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_volkhan.cpp
+++ b/src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_volkhan.cpp
@@ -78,9 +78,26 @@ public:
{
boss_volkhanAI(Creature* creature) : ScriptedAI(creature)
{
+ Initialize();
instance = creature->GetInstanceScript();
}
+ void Initialize()
+ {
+ m_bIsStriking = false;
+ m_bHasTemper = false;
+ m_bCanShatterGolem = false;
+
+ m_uiPause_Timer = 3500;
+ m_uiShatteringStomp_Timer = 0;
+ m_uiShatter_Timer = 5000;
+ m_uiDelay_Timer = 1000;
+ m_uiSummonPhase = 0;
+ GolemsShattered = 0;
+
+ m_uiHealthAmountModifier = 1;
+ }
+
InstanceScript* instance;
GuidList m_lGolemGUIDList;
@@ -100,18 +117,7 @@ public:
void Reset() override
{
- m_bIsStriking = false;
- m_bHasTemper = false;
- m_bCanShatterGolem = false;
-
- m_uiPause_Timer = 3500;
- m_uiShatteringStomp_Timer = 0;
- m_uiShatter_Timer = 5000;
- m_uiDelay_Timer = 1000;
- m_uiSummonPhase = 0;
- GolemsShattered = 0;
-
- m_uiHealthAmountModifier = 1;
+ Initialize();
DespawnGolem();
m_lGolemGUIDList.clear();
@@ -362,7 +368,19 @@ public:
struct npc_molten_golemAI : public ScriptedAI
{
- npc_molten_golemAI(Creature* creature) : ScriptedAI(creature) { }
+ npc_molten_golemAI(Creature* creature) : ScriptedAI(creature)
+ {
+ Initialize();
+ }
+
+ void Initialize()
+ {
+ m_bIsFrozen = false;
+
+ m_uiBlast_Timer = 20000;
+ m_uiDeathDelay_Timer = 0;
+ m_uiImmolation_Timer = 5000;
+ }
bool m_bIsFrozen;
@@ -372,11 +390,7 @@ public:
void Reset() override
{
- m_bIsFrozen = false;
-
- m_uiBlast_Timer = 20000;
- m_uiDeathDelay_Timer = 0;
- m_uiImmolation_Timer = 5000;
+ Initialize();
}
void AttackStart(Unit* who) override
diff --git a/src/server/scripts/Northrend/Ulduar/HallsOfStone/boss_sjonnir.cpp b/src/server/scripts/Northrend/Ulduar/HallsOfStone/boss_sjonnir.cpp
index 4e01cefaaaa..ac3df1e49aa 100644
--- a/src/server/scripts/Northrend/Ulduar/HallsOfStone/boss_sjonnir.cpp
+++ b/src/server/scripts/Northrend/Ulduar/HallsOfStone/boss_sjonnir.cpp
@@ -76,12 +76,20 @@ class boss_sjonnir : public CreatureScript
struct boss_sjonnirAI : public BossAI
{
- boss_sjonnirAI(Creature* creature) : BossAI(creature, DATA_SJONNIR) { }
+ boss_sjonnirAI(Creature* creature) : BossAI(creature, DATA_SJONNIR)
+ {
+ Initialize();
+ }
+
+ void Initialize()
+ {
+ abuseTheOoze = 0;
+ }
void Reset() override
{
_Reset();
- abuseTheOoze = 0;
+ Initialize();
}
void EnterCombat(Unit* who) override
@@ -211,13 +219,21 @@ class npc_malformed_ooze : public CreatureScript
struct npc_malformed_oozeAI : public ScriptedAI
{
- npc_malformed_oozeAI(Creature* creature) : ScriptedAI(creature) { }
+ npc_malformed_oozeAI(Creature* creature) : ScriptedAI(creature)
+ {
+ Initialize();
+ }
- void Reset() override
+ void Initialize()
{
_mergeTimer = 10000;
}
+ void Reset() override
+ {
+ Initialize();
+ }
+
void UpdateAI(uint32 diff) override
{
if (_mergeTimer <= diff)
diff --git a/src/server/scripts/Northrend/Ulduar/HallsOfStone/halls_of_stone.cpp b/src/server/scripts/Northrend/Ulduar/HallsOfStone/halls_of_stone.cpp
index 2c7bdf3465b..f98a6e40a07 100644
--- a/src/server/scripts/Northrend/Ulduar/HallsOfStone/halls_of_stone.cpp
+++ b/src/server/scripts/Northrend/Ulduar/HallsOfStone/halls_of_stone.cpp
@@ -138,10 +138,22 @@ public:
{
npc_tribuna_controllerAI(Creature* creature) : ScriptedAI(creature)
{
+ Initialize();
instance = creature->GetInstanceScript();
SetCombatMovement(false);
}
+ void Initialize()
+ {
+ uiKaddrakEncounterTimer = 1500;
+ uiMarnakEncounterTimer = 10000;
+ uiAbedneumEncounterTimer = 10000;
+
+ bKaddrakActivated = false;
+ bMarnakActivated = false;
+ bAbedneumActivated = false;
+ }
+
InstanceScript* instance;
uint32 uiKaddrakEncounterTimer;
@@ -156,13 +168,7 @@ public:
void Reset() override
{
- uiKaddrakEncounterTimer = 1500;
- uiMarnakEncounterTimer = 10000;
- uiAbedneumEncounterTimer = 10000;
-
- bKaddrakActivated = false;
- bMarnakActivated = false;
- bAbedneumActivated = false;
+ Initialize();
instance->HandleGameObject(instance->GetGuidData(DATA_GO_KADDRAK), false);
instance->HandleGameObject(instance->GetGuidData(DATA_GO_MARNAK), false);
@@ -290,9 +296,20 @@ public:
{
npc_brann_hosAI(Creature* creature) : npc_escortAI(creature)
{
+ Initialize();
instance = creature->GetInstanceScript();
}
+ void Initialize()
+ {
+ bIsLowHP = false;
+ bIsBattle = false;
+ uiStep = 0;
+ uiPhaseTimer = 0;
+ uiControllerGUID.Clear();
+ brannSparklinNews = true;
+ }
+
uint32 uiStep;
uint32 uiPhaseTimer;
@@ -309,12 +326,7 @@ public:
{
if (!HasEscortState(STATE_ESCORT_ESCORTING))
{
- bIsLowHP = false;
- bIsBattle = false;
- uiStep = 0;
- uiPhaseTimer = 0;
- uiControllerGUID.Clear();
- brannSparklinNews = true;
+ Initialize();
DespawnDwarf();
diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_algalon_the_observer.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_algalon_the_observer.cpp
index 18b3723307e..bd5b61e227f 100644
--- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_algalon_the_observer.cpp
+++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_algalon_the_observer.cpp
@@ -301,19 +301,25 @@ class boss_algalon_the_observer : public CreatureScript
{
boss_algalon_the_observerAI(Creature* creature) : BossAI(creature, BOSS_ALGALON)
{
+ Initialize();
_firstPull = true;
_fedOnTears = false;
}
- void Reset() override
+ void Initialize()
{
- _Reset();
- me->SetReactState(REACT_PASSIVE);
_phaseTwo = false;
_fightWon = false;
_hasYelled = false;
}
+ void Reset() override
+ {
+ _Reset();
+ me->SetReactState(REACT_PASSIVE);
+ Initialize();
+ }
+
void KilledUnit(Unit* victim) override
{
if (victim->GetTypeId() == TYPEID_UNIT)
@@ -715,13 +721,19 @@ class npc_living_constellation : public CreatureScript
{
npc_living_constellationAI(Creature* creature) : CreatureAI(creature)
{
+ Initialize();
+ }
+
+ void Initialize()
+ {
+ _isActive = false;
}
void Reset() override
{
_events.Reset();
_events.ScheduleEvent(EVENT_ARCANE_BARRAGE, 2500);
- _isActive = false;
+ Initialize();
}
uint32 GetData(uint32 /*type*/) const override
@@ -858,6 +870,7 @@ class npc_brann_bronzebeard_algalon : public CreatureScript
{
npc_brann_bronzebeard_algalonAI(Creature* creature) : CreatureAI(creature)
{
+ _currentPoint = 0;
}
void DoAction(int32 action) override
diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_assembly_of_iron.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_assembly_of_iron.cpp
index fd424ad971b..bb7a8592e04 100644
--- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_assembly_of_iron.cpp
+++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_assembly_of_iron.cpp
@@ -138,14 +138,22 @@ class boss_steelbreaker : public CreatureScript
struct boss_steelbreakerAI : public BossAI
{
- boss_steelbreakerAI(Creature* creature) : BossAI(creature, BOSS_ASSEMBLY_OF_IRON) { }
+ boss_steelbreakerAI(Creature* creature) : BossAI(creature, BOSS_ASSEMBLY_OF_IRON)
+ {
+ Initialize();
+ }
+
+ void Initialize()
+ {
+ phase = 0;
+ }
uint32 phase;
void Reset() override
{
_Reset();
- phase = 0;
+ Initialize();
me->RemoveAllAuras();
}
@@ -275,14 +283,22 @@ class boss_runemaster_molgeim : public CreatureScript
struct boss_runemaster_molgeimAI : public BossAI
{
- boss_runemaster_molgeimAI(Creature* creature) : BossAI(creature, BOSS_ASSEMBLY_OF_IRON) { }
+ boss_runemaster_molgeimAI(Creature* creature) : BossAI(creature, BOSS_ASSEMBLY_OF_IRON)
+ {
+ Initialize();
+ }
+
+ void Initialize()
+ {
+ phase = 0;
+ }
uint32 phase;
void Reset() override
{
_Reset();
- phase = 0;
+ Initialize();
me->RemoveAllAuras();
}
@@ -432,14 +448,22 @@ class boss_stormcaller_brundir : public CreatureScript
struct boss_stormcaller_brundirAI : public BossAI
{
- boss_stormcaller_brundirAI(Creature* creature) : BossAI(creature, BOSS_ASSEMBLY_OF_IRON) { }
+ boss_stormcaller_brundirAI(Creature* creature) : BossAI(creature, BOSS_ASSEMBLY_OF_IRON)
+ {
+ Initialize();
+ }
+
+ void Initialize()
+ {
+ phase = 0;
+ }
uint32 phase;
void Reset() override
{
_Reset();
- phase = 0;
+ Initialize();
me->RemoveAllAuras();
me->SetDisableGravity(false);
me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_INTERRUPT, false); // Should be interruptable unless overridden by spell (Overload)
diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_auriaya.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_auriaya.cpp
index 1245a232ae6..b84ba45951e 100644
--- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_auriaya.cpp
+++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_auriaya.cpp
@@ -107,17 +107,23 @@ class boss_auriaya : public CreatureScript
{
boss_auriayaAI(Creature* creature) : BossAI(creature, BOSS_AURIAYA)
{
+ Initialize();
}
- void Reset() override
+ void Initialize()
{
- _Reset();
DefenderGUID.Clear();
defenderLives = 8;
crazyCatLady = true;
nineLives = false;
}
+ void Reset() override
+ {
+ _Reset();
+ Initialize();
+ }
+
void EnterCombat(Unit* /*who*/) override
{
_EnterCombat();
diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_flame_leviathan.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_flame_leviathan.cpp
index 52cf017eb8e..959cb73a996 100644
--- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_flame_leviathan.cpp
+++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_flame_leviathan.cpp
@@ -226,14 +226,11 @@ class boss_flame_leviathan : public CreatureScript
{
boss_flame_leviathanAI(Creature* creature) : BossAI(creature, BOSS_LEVIATHAN), vehicle(creature->GetVehicleKit())
{
+ Initialize();
}
- void InitializeAI() override
+ void Initialize()
{
- ASSERT(vehicle);
- if (!me->isDead())
- Reset();
-
ActiveTowersCount = 4;
Shutdown = 0;
ActiveTowers = false;
@@ -243,6 +240,15 @@ class boss_flame_leviathan : public CreatureScript
towerOfFrost = false;
Shutout = true;
Unbroken = true;
+ }
+
+ void InitializeAI() override
+ {
+ ASSERT(vehicle);
+ if (!me->isDead())
+ Reset();
+
+ Initialize();
DoCast(SPELL_INVIS_AND_STEALTH_DETECT);
@@ -634,13 +640,19 @@ class boss_flame_leviathan_defense_cannon : public CreatureScript
{
boss_flame_leviathan_defense_cannonAI(Creature* creature) : ScriptedAI(creature)
{
+ Initialize();
+ }
+
+ void Initialize()
+ {
+ NapalmTimer = 5 * IN_MILLISECONDS;
}
uint32 NapalmTimer;
void Reset() override
{
- NapalmTimer = 5*IN_MILLISECONDS;
+ Initialize();
DoCast(me, AURA_STEALTH_DETECTION);
}
@@ -781,14 +793,20 @@ class npc_mechanolift : public CreatureScript
{
npc_mechanoliftAI(Creature* creature) : PassiveAI(creature)
{
+ Initialize();
ASSERT(me->GetVehicleKit());
}
+ void Initialize()
+ {
+ MoveTimer = 0;
+ }
+
uint32 MoveTimer;
void Reset() override
{
- MoveTimer = 0;
+ Initialize();
me->GetMotionMaster()->MoveRandom(50);
}
@@ -956,11 +974,17 @@ public:
{
npc_mimirons_infernoAI(Creature* creature) : npc_escortAI(creature)
{
+ Initialize();
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_NOT_SELECTABLE);
me->CastSpell(me, AURA_DUMMY_YELLOW, true);
me->SetReactState(REACT_PASSIVE);
}
+ void Initialize()
+ {
+ infernoTimer = 2000;
+ }
+
void WaypointReached(uint32 /*waypointId*/) override
{
@@ -968,7 +992,7 @@ public:
void Reset() override
{
- infernoTimer = 2000;
+ Initialize();
}
uint32 infernoTimer;
@@ -1047,14 +1071,20 @@ class npc_freyas_ward : public CreatureScript
{
npc_freyas_wardAI(Creature* creature) : ScriptedAI(creature)
{
+ Initialize();
me->CastSpell(me, AURA_DUMMY_GREEN, true);
}
+ void Initialize()
+ {
+ summonTimer = 5000;
+ }
+
uint32 summonTimer;
void Reset() override
{
- summonTimer = 5000;
+ Initialize();
}
void UpdateAI(uint32 diff) override
@@ -1090,14 +1120,20 @@ class npc_freya_ward_summon : public CreatureScript
{
npc_freya_ward_summonAI(Creature* creature) : ScriptedAI(creature)
{
+ Initialize();
creature->GetMotionMaster()->MoveRandom(100);
}
+ void Initialize()
+ {
+ lashTimer = 5000;
+ }
+
uint32 lashTimer;
void Reset() override
{
- lashTimer = 5000;
+ Initialize();
}
void UpdateAI(uint32 diff) override
@@ -1527,11 +1563,11 @@ class spell_auto_repair : public SpellScriptLoader
if (!vehicle)
return;
- Player* driver = vehicle->GetPassenger(0) ? vehicle->GetPassenger(0)->ToPlayer() : NULL;
+ Unit* driver = vehicle->GetPassenger(0);
if (!driver)
return;
- driver->MonsterTextEmote(EMOTE_REPAIR, driver, true);
+ driver->TextEmote(EMOTE_REPAIR, driver, true);
InstanceScript* instance = driver->GetInstanceScript();
if (!instance)
diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_freya.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_freya.cpp
index b3755672790..93fee8d1964 100644
--- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_freya.cpp
+++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_freya.cpp
@@ -266,26 +266,16 @@ class boss_freya : public CreatureScript
struct boss_freyaAI : public BossAI
{
- boss_freyaAI(Creature* creature) : BossAI(creature, BOSS_FREYA) { }
-
- ObjectGuid ElementalGUID[3][2];
-
- uint32 deforestation[6][2];
- uint32 elementalTimer[2];
- uint32 diffTimer;
- uint8 trioWaveCount;
- uint8 trioWaveController;
- uint8 waveCount;
- uint8 elderCount;
- uint8 attunedToNature;
-
- bool checkElementalAlive[2];
- bool trioDefeated[2];
- bool random[3];
+ boss_freyaAI(Creature* creature) : BossAI(creature, BOSS_FREYA)
+ {
+ Initialize();
+ memset(elementalTimer, 0, sizeof(elementalTimer));
+ diffTimer = 0;
+ attunedToNature = 0;
+ }
- void Reset() override
+ void Initialize()
{
- _Reset();
trioWaveCount = 0;
trioWaveController = 0;
waveCount = 0;
@@ -306,6 +296,27 @@ class boss_freya : public CreatureScript
random[n] = false;
}
+ ObjectGuid ElementalGUID[3][2];
+
+ uint32 deforestation[6][2];
+ uint32 elementalTimer[2];
+ uint32 diffTimer;
+ uint8 trioWaveCount;
+ uint8 trioWaveController;
+ uint8 waveCount;
+ uint8 elderCount;
+ uint8 attunedToNature;
+
+ bool checkElementalAlive[2];
+ bool trioDefeated[2];
+ bool random[3];
+
+ void Reset() override
+ {
+ _Reset();
+ Initialize();
+ }
+
void KilledUnit(Unit* who) override
{
if (who->GetTypeId() == TYPEID_PLAYER)
@@ -688,8 +699,6 @@ class boss_elder_brightleaf : public CreatureScript
events.ScheduleEvent(EVENT_SOLAR_FLARE, urand(5000, 7000));
events.ScheduleEvent(EVENT_UNSTABLE_SUN_BEAM, urand(7000, 12000));
events.ScheduleEvent(EVENT_FLUX, 5000);
- elderCount = 0;
- lumberjack = false;
}
void KilledUnit(Unit* who) override
@@ -757,9 +766,6 @@ class boss_elder_brightleaf : public CreatureScript
}
}
- if (lumberjack)
- lumberjackTimer += diff;
-
DoMeleeAttackIfReady();
}
@@ -767,21 +773,12 @@ class boss_elder_brightleaf : public CreatureScript
{
switch (action)
{
- case ACTION_ELDER_DEATH:
- ++elderCount;
- lumberjack = true;
- break;
case ACTION_ELDER_FREYA_KILLED:
me->DespawnOrUnsummon(10000);
_JustDied();
break;
}
}
-
- private:
- uint32 lumberjackTimer;
- uint8 elderCount;
- bool lumberjack;
};
CreatureAI* GetAI(Creature* creature) const override
@@ -809,8 +806,6 @@ class boss_elder_stonebark : public CreatureScript
events.ScheduleEvent(EVENT_TREMOR, urand(10000, 12000));
events.ScheduleEvent(EVENT_FISTS, urand(25000, 35000));
events.ScheduleEvent(EVENT_BARK, urand(37500, 40000));
- elderCount = 0;
- lumberjack = false;
}
void KilledUnit(Unit* who) override
@@ -884,9 +879,6 @@ class boss_elder_stonebark : public CreatureScript
}
}
- if (lumberjack)
- lumberjackTimer += diff;
-
DoMeleeAttackIfReady();
}
@@ -894,21 +886,12 @@ class boss_elder_stonebark : public CreatureScript
{
switch (action)
{
- case ACTION_ELDER_DEATH:
- ++elderCount;
- lumberjack = true;
- break;
case ACTION_ELDER_FREYA_KILLED:
me->DespawnOrUnsummon(10000);
_JustDied();
break;
}
}
-
- private:
- uint32 lumberjackTimer;
- uint8 elderCount;
- bool lumberjack;
};
CreatureAI* GetAI(Creature* creature) const override
@@ -936,8 +919,6 @@ class boss_elder_ironbranch : public CreatureScript
events.ScheduleEvent(EVENT_IMPALE, urand(18000, 22000));
events.ScheduleEvent(EVENT_IRON_ROOTS, urand(12000, 17000));
events.ScheduleEvent(EVENT_THORN_SWARM, urand(7500, 12500));
- elderCount = 0;
- lumberjack = false;
}
void KilledUnit(Unit* who) override
@@ -998,9 +979,6 @@ class boss_elder_ironbranch : public CreatureScript
}
}
- if (lumberjack)
- lumberjackTimer += diff;
-
DoMeleeAttackIfReady();
}
@@ -1008,21 +986,12 @@ class boss_elder_ironbranch : public CreatureScript
{
switch (action)
{
- case ACTION_ELDER_DEATH:
- ++elderCount;
- lumberjack = true;
- break;
case ACTION_ELDER_FREYA_KILLED:
me->DespawnOrUnsummon(10000);
_JustDied();
break;
}
}
-
- private:
- uint32 lumberjackTimer;
- uint8 elderCount;
- bool lumberjack;
};
CreatureAI* GetAI(Creature* creature) const override
@@ -1040,15 +1009,21 @@ class npc_detonating_lasher : public CreatureScript
{
npc_detonating_lasherAI(Creature* creature) : ScriptedAI(creature)
{
+ Initialize();
me->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_TAUNT, true);
}
- void Reset() override
+ void Initialize()
{
lashTimer = 5000;
changeTargetTimer = 7500;
}
+ void Reset() override
+ {
+ Initialize();
+ }
+
void UpdateAI(uint32 diff) override
{
if (!UpdateVictim())
@@ -1098,16 +1073,24 @@ class npc_ancient_water_spirit : public CreatureScript
{
npc_ancient_water_spiritAI(Creature* creature) : ScriptedAI(creature)
{
+ Initialize();
instance = me->GetInstanceScript();
if (Creature* Freya = ObjectAccessor::GetCreature(*me, instance->GetGuidData(BOSS_FREYA)))
waveCount = ENSURE_AI(boss_freya::boss_freyaAI, Freya->AI())->trioWaveCount;
+ else
+ waveCount = 0;
}
- void Reset() override
+ void Initialize()
{
tidalWaveTimer = 10000;
}
+ void Reset() override
+ {
+ Initialize();
+ }
+
void UpdateAI(uint32 diff) override
{
if (!UpdateVictim())
@@ -1158,17 +1141,25 @@ class npc_storm_lasher : public CreatureScript
{
npc_storm_lasherAI(Creature* creature) : ScriptedAI(creature)
{
+ Initialize();
instance = me->GetInstanceScript();
if (Creature* Freya = ObjectAccessor::GetCreature(*me, instance->GetGuidData(BOSS_FREYA)))
waveCount = ENSURE_AI(boss_freya::boss_freyaAI, Freya->AI())->trioWaveCount;
+ else
+ waveCount = 0;
}
- void Reset() override
+ void Initialize()
{
lightningLashTimer = 10000;
stormboltTimer = 5000;
}
+ void Reset() override
+ {
+ Initialize();
+ }
+
void UpdateAI(uint32 diff) override
{
if (!UpdateVictim())
@@ -1228,6 +1219,8 @@ class npc_snaplasher : public CreatureScript
instance = me->GetInstanceScript();
if (Creature* Freya = ObjectAccessor::GetCreature(*me, instance->GetGuidData(BOSS_FREYA)))
waveCount = ENSURE_AI(boss_freya::boss_freyaAI, Freya->AI())->trioWaveCount;
+ else
+ waveCount = 0;
}
void UpdateAI(uint32 /*diff*/) override
@@ -1270,12 +1263,18 @@ class npc_ancient_conservator : public CreatureScript
{
npc_ancient_conservatorAI(Creature* creature) : ScriptedAI(creature)
{
+ Initialize();
}
- void Reset() override
+ void Initialize()
{
natureFuryTimer = 7500;
healthySporeTimer = 3500;
+ }
+
+ void Reset() override
+ {
+ Initialize();
SummonHealthySpores(2);
}
diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_general_vezax.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_general_vezax.cpp
index 1b456815ec7..9cb5e71b471 100644
--- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_general_vezax.cpp
+++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_general_vezax.cpp
@@ -105,6 +105,15 @@ class boss_general_vezax : public CreatureScript
{
boss_general_vezaxAI(Creature* creature) : BossAI(creature, BOSS_VEZAX)
{
+ Initialize();
+ }
+
+ void Initialize()
+ {
+ shadowDodger = true;
+ smellSaronite = true;
+ animusDead = false;
+ vaporCount = 0;
}
bool shadowDodger;
@@ -116,10 +125,7 @@ class boss_general_vezax : public CreatureScript
{
_Reset();
- shadowDodger = true;
- smellSaronite = true;
- animusDead = false;
- vaporCount = 0;
+ Initialize();
}
void EnterCombat(Unit* /*who*/) override
diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_hodir.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_hodir.cpp
index 7eb6c72feab..f1cfea0e58f 100644
--- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_hodir.cpp
+++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_hodir.cpp
@@ -181,11 +181,18 @@ class npc_flash_freeze : public CreatureScript
{
npc_flash_freezeAI(Creature* creature) : ScriptedAI(creature)
{
+ Initialize();
instance = me->GetInstanceScript();
me->SetDisplayId(me->GetCreatureTemplate()->Modelid2);
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_DISABLE_MOVE | UNIT_FLAG_STUNNED | UNIT_FLAG_PACIFIED);
}
+ void Initialize()
+ {
+ targetGUID.Clear();
+ checkDespawnTimer = 1000;
+ }
+
InstanceScript* instance;
ObjectGuid targetGUID;
@@ -193,8 +200,7 @@ class npc_flash_freeze : public CreatureScript
void Reset() override
{
- targetGUID.Clear();
- checkDespawnTimer = 1000;
+ Initialize();
}
void UpdateAI(uint32 diff) override
@@ -311,9 +317,19 @@ class boss_hodir : public CreatureScript
{
boss_hodirAI(Creature* creature) : BossAI(creature, BOSS_HODIR)
{
+ Initialize();
me->SetReactState(REACT_PASSIVE);
}
+ void Initialize()
+ {
+ gettingColdInHereTimer = 0;
+ gettingColdInHere = false;
+ cheeseTheFreeze = false;
+ iHaveTheCoolestFriends = false;
+ iCouldSayThatThisCacheWasRare = false;
+ }
+
uint32 gettingColdInHereTimer;
bool gettingColdInHere;
@@ -323,11 +339,7 @@ class boss_hodir : public CreatureScript
void Reset() override
{
- gettingColdInHereTimer = 0;
- gettingColdInHere = false;
- cheeseTheFreeze = false;
- iHaveTheCoolestFriends = false;
- iCouldSayThatThisCacheWasRare = false;
+ Initialize();
_Reset();
me->SetReactState(REACT_PASSIVE);
@@ -525,16 +537,22 @@ class npc_icicle : public CreatureScript
{
npc_icicleAI(Creature* creature) : ScriptedAI(creature)
{
+ Initialize();
me->SetDisplayId(me->GetCreatureTemplate()->Modelid1);
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_DISABLE_MOVE | UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_PACIFIED | UNIT_FLAG_NOT_SELECTABLE);
me->SetReactState(REACT_PASSIVE);
}
+ void Initialize()
+ {
+ icicleTimer = 2500;
+ }
+
uint32 icicleTimer;
void Reset() override
{
- icicleTimer = 2500;
+ Initialize();
}
void UpdateAI(uint32 diff) override
@@ -573,16 +591,22 @@ class npc_snowpacked_icicle : public CreatureScript
{
npc_snowpacked_icicleAI(Creature* creature) : ScriptedAI(creature)
{
+ Initialize();
me->SetDisplayId(me->GetCreatureTemplate()->Modelid2);
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_DISABLE_MOVE | UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_NOT_SELECTABLE | UNIT_FLAG_PACIFIED);
me->SetReactState(REACT_PASSIVE);
}
+ void Initialize()
+ {
+ despawnTimer = 12000;
+ }
+
uint32 despawnTimer;
void Reset() override
{
- despawnTimer = 12000;
+ Initialize();
}
void UpdateAI(uint32 diff) override
diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_ignis.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_ignis.cpp
index e91e6ab4c5f..d4fbf959c53 100644
--- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_ignis.cpp
+++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_ignis.cpp
@@ -118,9 +118,17 @@ class boss_ignis : public CreatureScript
{
boss_ignis_AI(Creature* creature) : BossAI(creature, BOSS_IGNIS), _vehicle(me->GetVehicleKit())
{
+ Initialize();
ASSERT(_vehicle);
}
+ void Initialize()
+ {
+ _slagPotGUID.Clear();
+ _shattered = false;
+ _firstConstructKill = 0;
+ }
+
void Reset() override
{
_Reset();
@@ -140,9 +148,7 @@ class boss_ignis : public CreatureScript
events.ScheduleEvent(EVENT_CONSTRUCT, 15000);
events.ScheduleEvent(EVENT_END_POT, 40000);
events.ScheduleEvent(EVENT_BERSERK, 480000);
- _slagPotGUID.Clear();
- _shattered = false;
- _firstConstructKill = 0;
+ Initialize();
instance->DoStartTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEVEMENT_IGNIS_START_EVENT);
}
@@ -298,14 +304,20 @@ class npc_iron_construct : public CreatureScript
{
npc_iron_constructAI(Creature* creature) : ScriptedAI(creature), _instance(creature->GetInstanceScript())
{
+ Initialize();
creature->SetReactState(REACT_PASSIVE);
}
- void Reset() override
+ void Initialize()
{
_brittled = false;
}
+ void Reset() override
+ {
+ Initialize();
+ }
+
void DamageTaken(Unit* /*attacker*/, uint32& damage) override
{
if (me->HasAura(SPELL_BRITTLE) && damage >= 5000)
@@ -365,10 +377,18 @@ class npc_scorch_ground : public CreatureScript
{
npc_scorch_groundAI(Creature* creature) : ScriptedAI(creature)
{
+ Initialize();
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_DISABLE_MOVE |UNIT_FLAG_NOT_SELECTABLE | UNIT_FLAG_PACIFIED);
creature->SetDisplayId(16925); //model 2 in db cannot overwrite wdb fields
}
+ void Initialize()
+ {
+ _heat = false;
+ _constructGUID.Clear();
+ _heatTimer = 0;
+ }
+
void MoveInLineOfSight(Unit* who) override
{
if (!_heat)
@@ -386,10 +406,8 @@ class npc_scorch_ground : public CreatureScript
void Reset() override
{
- _heat = false;
+ Initialize();
DoCast(me, SPELL_GROUND);
- _constructGUID.Clear();
- _heatTimer = 0;
}
void UpdateAI(uint32 uiDiff) override
diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_razorscale.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_razorscale.cpp
index 9dff8025f7a..cad6b045120 100644
--- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_razorscale.cpp
+++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_razorscale.cpp
@@ -327,8 +327,19 @@ class boss_razorscale : public CreatureScript
{
boss_razorscaleAI(Creature* creature) : BossAI(creature, BOSS_RAZORSCALE)
{
+ Initialize();
// Do not let Razorscale be affected by Battle Shout buff
me->ApplySpellImmune(0, IMMUNITY_ID, (SPELL_BATTLE_SHOUT), true);
+ FlyCount = 0;
+ EnrageTimer = 0;
+ Enraged = false;
+ phase = PHASE_GROUND;
+ }
+
+ void Initialize()
+ {
+ PermaGround = false;
+ HarpoonCounter = 0;
}
Phases phase;
@@ -345,8 +356,7 @@ class boss_razorscale : public CreatureScript
me->SetCanFly(true);
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
me->SetReactState(REACT_PASSIVE);
- PermaGround = false;
- HarpoonCounter = 0;
+ Initialize();
if (Creature* commander = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_EXPEDITION_COMMANDER)))
commander->AI()->DoAction(ACTION_COMMANDER_RESET);
}
@@ -594,7 +604,14 @@ class npc_expedition_commander : public CreatureScript
{
npc_expedition_commanderAI(Creature* creature) : ScriptedAI(creature), summons(creature)
{
+ Initialize();
instance = me->GetInstanceScript();
+ }
+
+ void Initialize()
+ {
+ AttackStartTimer = 0;
+ Phase = 0;
Greet = false;
}
@@ -604,14 +621,12 @@ class npc_expedition_commander : public CreatureScript
bool Greet;
uint32 AttackStartTimer;
uint8 Phase;
- Creature* Engineer[4];
- Creature* Defender[4];
+ ObjectGuid Engineer[4];
+ ObjectGuid Defender[4];
void Reset() override
{
- AttackStartTimer = 0;
- Phase = 0;
- Greet = false;
+ Initialize();
summons.DespawnAll();
}
@@ -659,31 +674,40 @@ class npc_expedition_commander : public CreatureScript
case 2:
for (uint8 n = 0; n < RAID_MODE(2, 4); n++)
{
- Engineer[n] = me->SummonCreature(NPC_ENGINEER, PosEngSpawn, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 3000);
- Engineer[n]->SetWalk(false);
- Engineer[n]->SetSpeed(MOVE_RUN, 0.5f);
- Engineer[n]->SetHomePosition(PosEngRepair[n]);
- Engineer[n]->GetMotionMaster()->MoveTargetedHome();
+ if (Creature* summonedEngineer = me->SummonCreature(NPC_ENGINEER, PosEngSpawn, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 3000))
+ {
+ summonedEngineer->SetWalk(false);
+ summonedEngineer->SetSpeed(MOVE_RUN, 0.5f);
+ summonedEngineer->SetHomePosition(PosEngRepair[n]);
+ summonedEngineer->GetMotionMaster()->MoveTargetedHome();
+ Engineer[n] = summonedEngineer->GetGUID();
+ }
}
- Engineer[0]->AI()->Talk(SAY_AGGRO_3);
+ if (Creature* firstSummon = ObjectAccessor::GetCreature(*me, Engineer[0]))
+ firstSummon->AI()->Talk(SAY_AGGRO_3);
Phase = 3;
AttackStartTimer = 14000;
break;
case 3:
for (uint8 n = 0; n < 4; n++)
{
- Defender[n] = me->SummonCreature(NPC_DEFENDER, PosDefSpawn[n], TEMPSUMMON_CORPSE_TIMED_DESPAWN, 3000);
- Defender[n]->SetWalk(false);
- Defender[n]->SetHomePosition(PosDefCombat[n]);
- Defender[n]->GetMotionMaster()->MoveTargetedHome();
+ if (Creature* summonedDefender = me->SummonCreature(NPC_DEFENDER, PosDefSpawn[n], TEMPSUMMON_CORPSE_TIMED_DESPAWN, 3000))
+ {
+ summonedDefender->SetWalk(false);
+ summonedDefender->SetHomePosition(PosDefCombat[n]);
+ summonedDefender->GetMotionMaster()->MoveTargetedHome();
+ Defender[n] = summonedDefender->GetGUID();
+ }
}
Phase = 4;
break;
case 4:
for (uint8 n = 0; n < RAID_MODE(2, 4); n++)
- Engineer[n]->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_STATE_USE_STANDING);
+ if (Creature* summonedEngineer = ObjectAccessor::GetCreature(*me, Engineer[n]))
+ summonedEngineer->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_STATE_USE_STANDING);
for (uint8 n = 0; n < 4; ++n)
- Defender[n]->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_STATE_READY2H);
+ if (Creature* summonedDefender = ObjectAccessor::GetCreature(*me, Defender[n]))
+ summonedDefender->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_STATE_READY2H);
Talk(SAY_AGGRO_2);
AttackStartTimer = 16000;
Phase = 5;
@@ -694,7 +718,8 @@ class npc_expedition_commander : public CreatureScript
Razorscale->AI()->DoAction(ACTION_EVENT_START);
me->SetInCombatWith(Razorscale);
}
- Engineer[0]->AI()->Talk(SAY_AGGRO_1);
+ if (Creature* firstEngineer = ObjectAccessor::GetCreature(*me, Engineer[0]))
+ firstEngineer->AI()->Talk(SAY_AGGRO_1);
Phase = 6;
break;
}
@@ -748,10 +773,20 @@ class npc_mole_machine_trigger : public CreatureScript
{
npc_mole_machine_triggerAI(Creature* creature) : ScriptedAI(creature)
{
+ Initialize();
SetCombatMovement(false);
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_PACIFIED);
}
+ void Initialize()
+ {
+ SummonGobTimer = 2000;
+ SummonNpcTimer = 6000;
+ DissapearTimer = 10000;
+ GobSummoned = false;
+ NpcSummoned = false;
+ }
+
uint32 SummonGobTimer;
uint32 SummonNpcTimer;
uint32 DissapearTimer;
@@ -760,11 +795,7 @@ class npc_mole_machine_trigger : public CreatureScript
void Reset() override
{
- SummonGobTimer = 2000;
- SummonNpcTimer = 6000;
- DissapearTimer = 10000;
- GobSummoned = false;
- NpcSummoned = false;
+ Initialize();
}
void UpdateAI(uint32 Diff) override
@@ -851,15 +882,23 @@ class npc_darkrune_watcher : public CreatureScript
struct npc_darkrune_watcherAI : public ScriptedAI
{
- npc_darkrune_watcherAI(Creature* creature) : ScriptedAI(creature){ }
+ npc_darkrune_watcherAI(Creature* creature) : ScriptedAI(creature)
+ {
+ Initialize();
+ }
+
+ void Initialize()
+ {
+ ChainTimer = urand(10000, 15000);
+ LightTimer = urand(1000, 3000);
+ }
uint32 ChainTimer;
uint32 LightTimer;
void Reset() override
{
- ChainTimer = urand(10000, 15000);
- LightTimer = urand(1000, 3000);
+ Initialize();
}
void UpdateAI(uint32 Diff) override
@@ -900,14 +939,22 @@ class npc_darkrune_guardian : public CreatureScript
struct npc_darkrune_guardianAI : public ScriptedAI
{
- npc_darkrune_guardianAI(Creature* creature) : ScriptedAI(creature){ }
+ npc_darkrune_guardianAI(Creature* creature) : ScriptedAI(creature)
+ {
+ Initialize();
+ }
+
+ void Initialize()
+ {
+ StormTimer = urand(3000, 6000);
+ killedByBreath = false;
+ }
uint32 StormTimer;
void Reset() override
{
- StormTimer = urand(3000, 6000);
- killedByBreath = false;
+ Initialize();
}
uint32 GetData(uint32 type) const override
@@ -955,7 +1002,17 @@ class npc_darkrune_sentinel : public CreatureScript
struct npc_darkrune_sentinelAI : public ScriptedAI
{
- npc_darkrune_sentinelAI(Creature* creature) : ScriptedAI(creature){ }
+ npc_darkrune_sentinelAI(Creature* creature) : ScriptedAI(creature)
+ {
+ Initialize();
+ }
+
+ void Initialize()
+ {
+ HeroicTimer = urand(4000, 8000);
+ WhirlTimer = urand(20000, 25000);
+ ShoutTimer = urand(15000, 30000);
+ }
uint32 HeroicTimer;
uint32 WhirlTimer;
@@ -963,9 +1020,7 @@ class npc_darkrune_sentinel : public CreatureScript
void Reset() override
{
- HeroicTimer = urand(4000, 8000);
- WhirlTimer = urand(20000, 25000);
- ShoutTimer = urand(15000, 30000);
+ Initialize();
}
void UpdateAI(uint32 Diff) override
diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_xt002.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_xt002.cpp
index cfc9b0f5cdc..2032c7b861d 100644
--- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_xt002.cpp
+++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_xt002.cpp
@@ -196,6 +196,18 @@ class boss_xt002 : public CreatureScript
{
boss_xt002_AI(Creature* creature) : BossAI(creature, BOSS_XT002)
{
+ Initialize();
+ _transferHealth = 0;
+ }
+
+ void Initialize()
+ {
+ _healthRecovered = false;
+ _gravityBombCasualty = false;
+ _hardMode = false;
+
+ _phase = 1;
+ _heartExposed = 0;
}
void Reset() override
@@ -206,12 +218,7 @@ class boss_xt002 : public CreatureScript
me->SetReactState(REACT_AGGRESSIVE);
DoCast(me, SPELL_STAND);
- _healthRecovered = false;
- _gravityBombCasualty = false;
- _hardMode = false;
-
- _phase = 1;
- _heartExposed = 0;
+ Initialize();
instance->DoStopTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEV_MUST_DECONSTRUCT_FASTER);
}
@@ -390,8 +397,9 @@ class boss_xt002 : public CreatureScript
Talk(SAY_HEART_CLOSED);
Talk(EMOTE_HEART_CLOSED);
- DoCast(me, SPELL_STAND);
+ me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
me->SetReactState(REACT_AGGRESSIVE);
+ DoCast(me, SPELL_STAND);
_phase = 1;
@@ -489,14 +497,20 @@ class npc_scrapbot : public CreatureScript
{
npc_scrapbotAI(Creature* creature) : ScriptedAI(creature)
{
+ Initialize();
_instance = me->GetInstanceScript();
}
+ void Initialize()
+ {
+ _rangeCheckTimer = 500;
+ }
+
void Reset() override
{
me->SetReactState(REACT_PASSIVE);
- _rangeCheckTimer = 500;
+ Initialize();
if (Creature* pXT002 = ObjectAccessor::GetCreature(*me, _instance->GetGuidData(BOSS_XT002)))
me->GetMotionMaster()->MoveFollow(pXT002, 0.0f, 0.0f);
@@ -546,14 +560,20 @@ class npc_pummeller : public CreatureScript
{
npc_pummellerAI(Creature* creature) : ScriptedAI(creature)
{
+ Initialize();
_instance = creature->GetInstanceScript();
}
- void Reset() override
+ void Initialize()
{
_arcingSmashTimer = TIMER_ARCING_SMASH;
_trampleTimer = TIMER_TRAMPLE;
_uppercutTimer = TIMER_UPPERCUT;
+ }
+
+ void Reset() override
+ {
+ Initialize();
if (Creature* xt002 = ObjectAccessor::GetCreature(*me, _instance->GetGuidData(BOSS_XT002)))
{
@@ -647,12 +667,18 @@ class npc_boombot : public CreatureScript
{
npc_boombotAI(Creature* creature) : ScriptedAI(creature)
{
+ Initialize();
_instance = creature->GetInstanceScript();
}
- void Reset() override
+ void Initialize()
{
_boomed = false;
+ }
+
+ void Reset() override
+ {
+ Initialize();
DoCast(SPELL_AURA_BOOMBOT); // For achievement
@@ -726,12 +752,18 @@ class npc_life_spark : public CreatureScript
{
npc_life_sparkAI(Creature* creature) : ScriptedAI(creature)
{
+ Initialize();
+ }
+
+ void Initialize()
+ {
+ _shockTimer = 0; // first one is immediate.
}
void Reset() override
{
DoCast(me, SPELL_STATIC_CHARGED);
- _shockTimer = 0; // first one is immediate.
+ Initialize();
}
void UpdateAI(uint32 diff) override
@@ -1006,37 +1038,6 @@ class spell_xt002_submerged : public SpellScriptLoader
}
};
-class spell_xt002_stand : public SpellScriptLoader
-{
- public:
- spell_xt002_stand() : SpellScriptLoader("spell_xt002_stand") { }
-
- class spell_xt002_stand_SpellScript : public SpellScript
- {
- PrepareSpellScript(spell_xt002_stand_SpellScript);
-
- void HandleScript(SpellEffIndex /*eff*/)
- {
- Creature* target = GetHitCreature();
- if (!target)
- return;
-
- target->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
- target->SetByteValue(UNIT_FIELD_BYTES_1, 0, UNIT_STAND_STATE_STAND);
- }
-
- void Register() override
- {
- OnEffectHitTarget += SpellEffectFn(spell_xt002_stand_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT);
- }
- };
-
- SpellScript* GetSpellScript() const override
- {
- return new spell_xt002_stand_SpellScript();
- }
-};
-
class achievement_nerf_engineering : public AchievementCriteriaScript
{
public:
@@ -1095,7 +1096,6 @@ void AddSC_boss_xt002()
new spell_xt002_heart_overload_periodic();
new spell_xt002_tympanic_tantrum();
new spell_xt002_submerged();
- new spell_xt002_stand();
new achievement_nerf_engineering();
new achievement_heartbreaker();
diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_yogg_saron.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_yogg_saron.cpp
index 9cbd7be8059..391aebf9229 100644
--- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_yogg_saron.cpp
+++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_yogg_saron.cpp
@@ -427,9 +427,17 @@ class boss_voice_of_yogg_saron : public CreatureScript
{
boss_voice_of_yogg_saronAI(Creature* creature) : BossAI(creature, BOSS_YOGG_SARON)
{
+ Initialize();
SetCombatMovement(false);
}
+ void Initialize()
+ {
+ _guardiansCount = 0;
+ _guardianTimer = 20000;
+ _illusionShattered = false;
+ }
+
void MoveInLineOfSight(Unit* who) override
{
@@ -467,9 +475,7 @@ class boss_voice_of_yogg_saron : public CreatureScript
instance->SetData(DATA_DRIVE_ME_CRAZY, uint32(true));
instance->DoStopTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEV_TIMED_START_EVENT);
- _guardiansCount = 0;
- _guardianTimer = 20000;
- _illusionShattered = false;
+ Initialize();
bool clockwise = false;
std::list<TempSummon*> clouds;
@@ -1014,7 +1020,10 @@ class boss_brain_of_yogg_saron : public CreatureScript
struct boss_brain_of_yogg_saronAI : public PassiveAI
{
- boss_brain_of_yogg_saronAI(Creature* creature) : PassiveAI(creature), _instance(creature->GetInstanceScript()), _summons(creature) { }
+ boss_brain_of_yogg_saronAI(Creature* creature) : PassiveAI(creature), _instance(creature->GetInstanceScript()), _summons(creature)
+ {
+ _tentaclesKilled = 0;
+ }
void Reset() override
{
@@ -1953,7 +1962,7 @@ class spell_yogg_saron_target_selectors : public SpellScriptLoader // 63744,
class SanityReduction : public SpellScript
{
public:
- SanityReduction() : SpellScript() { }
+ SanityReduction() : SpellScript(), _stacks(0) { }
SanityReduction(uint8 stacks) : SpellScript(), _stacks(stacks) { }
void RemoveSanity(SpellEffIndex /*effIndex*/)
diff --git a/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/boss_ingvar_the_plunderer.cpp b/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/boss_ingvar_the_plunderer.cpp
index 8861b0a1332..c08e1934552 100644
--- a/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/boss_ingvar_the_plunderer.cpp
+++ b/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/boss_ingvar_the_plunderer.cpp
@@ -264,6 +264,9 @@ class npc_annhylde_the_caller : public CreatureScript
{
npc_annhylde_the_callerAI(Creature* creature) : ScriptedAI(creature)
{
+ x = 0.f;
+ y = 0.f;
+ z = 0.f;
_instance = creature->GetInstanceScript();
}
diff --git a/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/boss_keleseth.cpp b/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/boss_keleseth.cpp
index 01532daf0cd..02cf5ade52a 100644
--- a/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/boss_keleseth.cpp
+++ b/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/boss_keleseth.cpp
@@ -115,7 +115,15 @@ class boss_keleseth : public CreatureScript
struct boss_kelesethAI : public BossAI
{
- boss_kelesethAI(Creature* creature) : BossAI(creature, DATA_PRINCE_KELESETH) { }
+ boss_kelesethAI(Creature* creature) : BossAI(creature, DATA_PRINCE_KELESETH)
+ {
+ Initialize();
+ }
+
+ void Initialize()
+ {
+ onTheRocks = true;
+ }
void Reset() override
{
@@ -124,7 +132,7 @@ class boss_keleseth : public CreatureScript
events.ScheduleEvent(EVENT_FROST_TOMB, urand(14, 19)*IN_MILLISECONDS);
events.ScheduleEvent(EVENT_SUMMON_SKELETONS, 6*IN_MILLISECONDS);
- onTheRocks = true;
+ Initialize();
}
void EnterCombat(Unit* who) override
diff --git a/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_palehoof.cpp b/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_palehoof.cpp
index b8ad5d07bcb..061499f2025 100644
--- a/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_palehoof.cpp
+++ b/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_palehoof.cpp
@@ -92,20 +92,11 @@ public:
{
boss_palehoofAI(Creature* creature) : BossAI(creature, DATA_GORTOK_PALEHOOF)
{
+ Initialize();
}
- uint32 uiArcingSmashTimer;
- uint32 uiImpaleTimer;
- uint32 uiWhiteringRoarTimer;
- uint32 uiWaitingTimer;
- Phase currentPhase;
- uint8 AddCount;
- Phase Sequence[4];
-
- void Reset() override
+ void Initialize()
{
- _Reset();
-
/// There is a good reason to store them like this, we are going to shuffle the order.
for (uint32 i = PHASE_FRENZIED_WORGEN; i < PHASE_GORTOK_PALEHOOF; ++i)
Sequence[i] = Phase(i);
@@ -117,11 +108,25 @@ public:
uiImpaleTimer = 12000;
uiWhiteringRoarTimer = 10000;
- me->GetMotionMaster()->MoveTargetedHome();
-
AddCount = 0;
currentPhase = PHASE_NONE;
+ }
+
+ uint32 uiArcingSmashTimer;
+ uint32 uiImpaleTimer;
+ uint32 uiWhiteringRoarTimer;
+ Phase currentPhase;
+ uint8 AddCount;
+ Phase Sequence[4];
+
+ void Reset() override
+ {
+ _Reset();
+
+ Initialize();
+
+ me->GetMotionMaster()->MoveTargetedHome();
for (uint8 i = DATA_FRENZIED_WORGEN; i <= DATA_FEROCIOUS_RHINO; ++i)
if (Creature* temp = ObjectAccessor::GetCreature(*me, instance->GetGuidData(i)))
@@ -263,9 +268,17 @@ public:
{
npc_ravenous_furbolgAI(Creature* creature) : ScriptedAI(creature)
{
+ Initialize();
instance = creature->GetInstanceScript();
}
+ void Initialize()
+ {
+ uiChainLightingTimer = 5000;
+ uiCrazedTimer = 10000;
+ uiTerrifyingRoarTimer = 15000;
+ }
+
uint32 uiChainLightingTimer;
uint32 uiCrazedTimer;
uint32 uiTerrifyingRoarTimer;
@@ -274,9 +287,7 @@ public:
void Reset() override
{
- uiChainLightingTimer = 5000;
- uiCrazedTimer = 10000;
- uiTerrifyingRoarTimer = 15000;
+ Initialize();
me->GetMotionMaster()->MoveTargetedHome();
@@ -371,9 +382,17 @@ public:
{
npc_frenzied_worgenAI(Creature* creature) : ScriptedAI(creature)
{
+ Initialize();
instance = creature->GetInstanceScript();
}
+ void Initialize()
+ {
+ uiMortalWoundTimer = 5000;
+ uiEnrage1Timer = 15000;
+ uiEnrage2Timer = 10000;
+ }
+
uint32 uiMortalWoundTimer;
uint32 uiEnrage1Timer;
uint32 uiEnrage2Timer;
@@ -382,9 +401,7 @@ public:
void Reset() override
{
- uiMortalWoundTimer = 5000;
- uiEnrage1Timer = 15000;
- uiEnrage2Timer = 10000;
+ Initialize();
me->GetMotionMaster()->MoveTargetedHome();
@@ -481,9 +498,17 @@ public:
{
npc_ferocious_rhinoAI(Creature* creature) : ScriptedAI(creature)
{
+ Initialize();
instance = creature->GetInstanceScript();
}
+ void Initialize()
+ {
+ uiStompTimer = 10000;
+ uiGoreTimer = 15000;
+ uiGrievousWoundTimer = 20000;
+ }
+
uint32 uiStompTimer;
uint32 uiGoreTimer;
uint32 uiGrievousWoundTimer;
@@ -492,9 +517,7 @@ public:
void Reset() override
{
- uiStompTimer = 10000;
- uiGoreTimer = 15000;
- uiGrievousWoundTimer = 20000;
+ Initialize();
me->GetMotionMaster()->MoveTargetedHome();
@@ -596,9 +619,17 @@ public:
{
npc_massive_jormungarAI(Creature* creature) : ScriptedAI(creature)
{
+ Initialize();
instance = creature->GetInstanceScript();
}
+ void Initialize()
+ {
+ uiAcidSpitTimer = 3000;
+ uiAcidSplatterTimer = 12000;
+ uiPoisonBreathTimer = 10000;
+ }
+
uint32 uiAcidSpitTimer;
uint32 uiAcidSplatterTimer;
uint32 uiPoisonBreathTimer;
@@ -607,9 +638,7 @@ public:
void Reset() override
{
- uiAcidSpitTimer = 3000;
- uiAcidSplatterTimer = 12000;
- uiPoisonBreathTimer = 10000;
+ Initialize();
me->GetMotionMaster()->MoveTargetedHome();
@@ -697,17 +726,23 @@ public:
{
npc_palehoof_orbAI(Creature* creature) : ScriptedAI(creature)
{
+ Initialize();
instance = creature->GetInstanceScript();
}
+ void Initialize()
+ {
+ currentPhase = PHASE_NONE;
+ SummonTimer = 5000;
+ }
+
InstanceScript* instance;
uint32 SummonTimer;
Phase currentPhase;
void Reset() override
{
- currentPhase = PHASE_NONE;
- SummonTimer = 5000;
+ Initialize();
//! HACK: Creature's can't have MOVEMENTFLAG_FLYING
me->AddUnitMovementFlag(MOVEMENTFLAG_FLYING);
me->RemoveAurasDueToSpell(SPELL_ORB_VISUAL);
diff --git a/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_skadi.cpp b/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_skadi.cpp
index fb40f794fd5..5d6a2416d73 100644
--- a/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_skadi.cpp
+++ b/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_skadi.cpp
@@ -169,7 +169,23 @@ public:
{
boss_skadiAI(Creature* creature) : ScriptedAI(creature), Summons(me)
{
+ Initialize();
instance = creature->GetInstanceScript();
+ m_uiMovementTimer = 0;
+ m_uiSummonTimer = 0;
+ }
+
+ void Initialize()
+ {
+ m_uiCrushTimer = 8000;
+ m_uiPoisonedSpearTimer = 10000;
+ m_uiWhirlwindTimer = 20000;
+ m_uiMountTimer = 3000;
+ m_uiWaypointId = 0;
+ m_bSaidEmote = false;
+ m_uiSpellHitCount = 0;
+
+ Phase = SKADI;
}
InstanceScript* instance;
@@ -190,15 +206,7 @@ public:
void Reset() override
{
- m_uiCrushTimer = 8000;
- m_uiPoisonedSpearTimer = 10000;
- m_uiWhirlwindTimer = 20000;
- m_uiMountTimer = 3000;
- m_uiWaypointId = 0;
- m_bSaidEmote = false;
- m_uiSpellHitCount = 0;
-
- Phase = SKADI;
+ Initialize();
Summons.DespawnAll();
me->SetSpeed(MOVE_FLIGHT, 3.0f);
diff --git a/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_svala.cpp b/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_svala.cpp
index d69f0885f58..bf9d9eaa43b 100644
--- a/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_svala.cpp
+++ b/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_svala.cpp
@@ -137,13 +137,20 @@ class boss_svala : public CreatureScript
{
boss_svalaAI(Creature* creature) : BossAI(creature, DATA_SVALA_SORROWGRAVE)
{
+ Initialize();
_introCompleted = false;
}
+ void Initialize()
+ {
+ _arthasGUID.Clear();
+ _sacrificed = false;
+ }
+
void Reset() override
{
_Reset();
- _sacrificed = false;
+
SetCombatMovement(true);
if (_introCompleted)
@@ -153,7 +160,7 @@ class boss_svala : public CreatureScript
me->SetDisableGravity(events.IsInPhase(NORMAL));
- _arthasGUID.Clear();
+ Initialize();
instance->SetGuidData(DATA_SACRIFICED_PLAYER, ObjectGuid::Empty);
}
@@ -398,17 +405,23 @@ class npc_ritual_channeler : public CreatureScript
{
npc_ritual_channelerAI(Creature* creature) : ScriptedAI(creature)
{
+ Initialize();
instance = creature->GetInstanceScript();
SetCombatMovement(false);
}
+ void Initialize()
+ {
+ paralyzeTimer = 1600;
+ }
+
InstanceScript* instance;
uint32 paralyzeTimer;
void Reset() override
{
- paralyzeTimer = 1600;
+ Initialize();
if (IsHeroic())
DoCast(me, SPELL_SHADOWS_IN_THE_DARK);
@@ -514,16 +527,24 @@ class npc_scourge_hulk : public CreatureScript
struct npc_scourge_hulkAI : public ScriptedAI
{
- npc_scourge_hulkAI(Creature* creature) : ScriptedAI(creature) { }
+ npc_scourge_hulkAI(Creature* creature) : ScriptedAI(creature)
+ {
+ Initialize();
+ }
+
+ void Initialize()
+ {
+ mightyBlow = urand(4000, 9000);
+ volatileInfection = urand(10000, 14000);
+ killedByRitualStrike = false;
+ }
uint32 mightyBlow;
uint32 volatileInfection;
void Reset() override
{
- mightyBlow = urand(4000, 9000);
- volatileInfection = urand(10000, 14000);
- killedByRitualStrike = false;
+ Initialize();
}
uint32 GetData(uint32 type) const override
diff --git a/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_ymiron.cpp b/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_ymiron.cpp
index 9521d0cf4cf..c4312e08704 100644
--- a/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_ymiron.cpp
+++ b/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_ymiron.cpp
@@ -15,22 +15,16 @@
* with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-/* Script Data Start
-SDName: Boss ymiron
-SDAuthor: LordVanMartin
-SD%Complete:
-SDComment:
-SDCategory:
-Script Data End */
-
#include "ScriptMgr.h"
#include "ScriptedCreature.h"
#include "utgarde_pinnacle.h"
#include "SpellInfo.h"
+#include "SpellScript.h"
enum Spells
{
SPELL_BANE = 48294,
+ SPELL_BANE_HIT = 59203, // Checked for King's Bane achievement.
SPELL_DARK_SLASH = 48292,
SPELL_FETID_ROT = 48291,
SPELL_SCREAMS_OF_THE_DEAD = 51750,
@@ -47,8 +41,7 @@ enum Spells
SPELL_SPIRIT_FOUNT = 48380
};
-//not in db
-enum Yells
+enum Texts
{
SAY_AGGRO = 0,
SAY_SLAY = 1,
@@ -59,18 +52,27 @@ enum Yells
SAY_SUMMON_TORGYN = 6
};
-enum Creatures
+enum Events
{
- NPC_BJORN = 27303,
- NPC_BJORN_VISUAL = 27304,
- NPC_HALDOR = 27307,
- NPC_HALDOR_VISUAL = 27310,
- NPC_RANULF = 27308,
- NPC_RANULF_VISUAL = 27311,
- NPC_TORGYN = 27309,
- NPC_TORGYN_VISUAL = 27312,
- NPC_SPIRIT_FOUNT = 27339,
- NPC_AVENGING_SPIRIT = 27386
+ EVENT_BANE = 1,
+ EVENT_FETID_ROT,
+ EVENT_DARK_SLASH,
+ EVENT_ANCESTORS_VENGEANCE,
+ EVENT_RESUME_COMBAT, // Handles react state and schedules the next event after roleplay ends.
+ EVENT_BJORN_SPIRIT_FOUNT,
+ EVENT_HALDOR_SPIRIT_STRIKE,
+ EVENT_RANULF_SPIRIT_BURST,
+ EVENT_TORGYN_SUMMON_AVENGING_SPIRITS
+};
+
+enum EventGroups
+{
+ EVENT_GROUP_BASE_SPELLS = 1
+};
+
+enum MovePoints
+{
+ POINT_BOAT
};
struct ActiveBoatStruct
@@ -78,14 +80,15 @@ struct ActiveBoatStruct
uint32 npc;
int32 say;
float MoveX, MoveY, MoveZ, SpawnX, SpawnY, SpawnZ, SpawnO;
+ uint32 event;
};
static ActiveBoatStruct ActiveBoat[4] =
{
- {NPC_BJORN_VISUAL, SAY_SUMMON_BJORN, 404.379f, -335.335f, 104.756f, 413.594f, -335.408f, 107.995f, 3.157f},
- {NPC_HALDOR_VISUAL, SAY_SUMMON_HALDOR, 380.813f, -335.069f, 104.756f, 369.994f, -334.771f, 107.995f, 6.232f},
- {NPC_RANULF_VISUAL, SAY_SUMMON_RANULF, 381.546f, -314.362f, 104.756f, 370.841f, -314.426f, 107.995f, 6.232f},
- {NPC_TORGYN_VISUAL, SAY_SUMMON_TORGYN, 404.310f, -314.761f, 104.756f, 413.992f, -314.703f, 107.995f, 3.157f}
+ {NPC_BJORN_VISUAL, SAY_SUMMON_BJORN, 404.379f, -335.335f, 104.756f, 413.594f, -335.408f, 107.995f, 3.157f, EVENT_BJORN_SPIRIT_FOUNT},
+ {NPC_HALDOR_VISUAL, SAY_SUMMON_HALDOR, 380.813f, -335.069f, 104.756f, 369.994f, -334.771f, 107.995f, 6.232f, EVENT_HALDOR_SPIRIT_STRIKE},
+ {NPC_RANULF_VISUAL, SAY_SUMMON_RANULF, 381.546f, -314.362f, 104.756f, 370.841f, -314.426f, 107.995f, 6.232f, EVENT_RANULF_SPIRIT_BURST},
+ {NPC_TORGYN_VISUAL, SAY_SUMMON_TORGYN, 404.310f, -314.761f, 104.756f, 413.992f, -314.703f, 107.995f, 3.157f, EVENT_TORGYN_SUMMON_AVENGING_SPIRITS}
};
enum Misc
@@ -102,84 +105,49 @@ public:
{
boss_ymironAI(Creature* creature) : BossAI(creature, DATA_KING_YMIRON)
{
+ Initialize();
+ // This ensures a random sequence of ancestors. Not sure if the order should change on reset or not, reason why this is left out of Initialize().
for (int i = 0; i < 4; ++i)
- m_uiActiveOrder[i] = i;
+ ActiveOrder[i] = i;
for (int i = 0; i < 3; ++i)
{
int r = i + (rand32() % (4 - i));
- int temp = m_uiActiveOrder[i];
- m_uiActiveOrder[i] = m_uiActiveOrder[r];
- m_uiActiveOrder[r] = temp;
+ int temp = ActiveOrder[i];
+ ActiveOrder[i] = ActiveOrder[r];
+ ActiveOrder[r] = temp;
}
}
- bool m_bIsWalking;
- bool m_bIsPause;
- bool m_bIsActiveWithBJORN;
- bool m_bIsActiveWithHALDOR;
- bool m_bIsActiveWithRANULF;
- bool m_bIsActiveWithTORGYN;
- bool kingsBane; // Achievement King's Bane
-
- uint8 m_uiActiveOrder[4];
- uint8 m_uiActivedNumber;
-
- uint32 m_uiFetidRot_Timer;
- uint32 m_uiBane_Timer;
- uint32 m_uiDarkSlash_Timer;
- uint32 m_uiAncestors_Vengeance_Timer;
-
- uint32 m_uiAbility_BJORN_Timer;
- uint32 m_uiAbility_HALDOR_Timer;
- uint32 m_uiAbility_RANULF_Timer;
- uint32 m_uiAbility_TORGYN_Timer;
-
- uint32 m_uiPause_Timer;
- uint32 m_uiHealthAmountModifier;
- uint32 m_uiHealthAmountMultipler;
-
- ObjectGuid m_uiActivedCreatureGUID;
- ObjectGuid m_uiOrbGUID;
+ void Initialize()
+ {
+ kingsBane = true;
+ ActivedNumber = 0;
+ HealthAmountModifier = 1;
+ HealthAmountMultipler = DUNGEON_MODE(20, 25);
+ ActiveAncestorGUID.Clear();
+ SpiritFountGUID.Clear();
+ }
void Reset() override
{
_Reset();
- m_bIsWalking = false;
- m_bIsPause = false;
- m_bIsActiveWithBJORN = false;
- m_bIsActiveWithHALDOR = false;
- m_bIsActiveWithRANULF = false;
- m_bIsActiveWithTORGYN = false;
- kingsBane = true;
-
- m_uiFetidRot_Timer = urand(8000, 13000);
- m_uiBane_Timer = urand(18000, 23000);
- m_uiDarkSlash_Timer = urand(28000, 33000);
- m_uiAncestors_Vengeance_Timer = DUNGEON_MODE(60000, 45000);
- m_uiPause_Timer = 0;
-
- m_uiAbility_BJORN_Timer = 0;
- m_uiAbility_HALDOR_Timer = 0;
- m_uiAbility_RANULF_Timer = 0;
- m_uiAbility_TORGYN_Timer = 0;
-
- m_uiActivedNumber = 0;
- m_uiHealthAmountModifier = 1;
- m_uiHealthAmountMultipler = DUNGEON_MODE(20, 25);
-
- m_uiActivedCreatureGUID.Clear();
- m_uiOrbGUID.Clear();
+ Initialize();
+ me->SetReactState(REACT_AGGRESSIVE);
}
void EnterCombat(Unit* /*who*/) override
{
_EnterCombat();
Talk(SAY_AGGRO);
+ events.ScheduleEvent(EVENT_BANE, urand(18000, 23000), EVENT_GROUP_BASE_SPELLS);
+ events.ScheduleEvent(EVENT_FETID_ROT, urand(8000, 13000), EVENT_GROUP_BASE_SPELLS);
+ events.ScheduleEvent(EVENT_DARK_SLASH, urand(28000, 33000), EVENT_GROUP_BASE_SPELLS);
+ events.ScheduleEvent(EVENT_ANCESTORS_VENGEANCE, DUNGEON_MODE(60000, 45000), EVENT_GROUP_BASE_SPELLS);
}
void SpellHitTarget(Unit* who, SpellInfo const* spell) override
{
- if (who && who->GetTypeId() == TYPEID_PLAYER && spell->Id == 59302)
+ if (who && who->GetTypeId() == TYPEID_PLAYER && spell->Id == SPELL_BANE_HIT)
kingsBane = false;
}
@@ -191,161 +159,115 @@ public:
return 0;
}
- void UpdateAI(uint32 diff) override
+ void MovementInform(uint32 type, uint32 pointId) override
{
- if (m_bIsWalking)
+ if (type != POINT_MOTION_TYPE)
+ return;
+
+ if (pointId == POINT_BOAT) // Check might not be needed.
{
- if (m_uiPause_Timer <= diff)
+ Talk(ActiveBoat[ActiveOrder[ActivedNumber]].say);
+ if (Creature* ancestor = me->SummonCreature(ActiveBoat[ActiveOrder[ActivedNumber]].npc, ActiveBoat[ActiveOrder[ActivedNumber]].SpawnX, ActiveBoat[ActiveOrder[ActivedNumber]].SpawnY, ActiveBoat[ActiveOrder[ActivedNumber]].SpawnZ, ActiveBoat[ActiveOrder[ActivedNumber]].SpawnO, TEMPSUMMON_CORPSE_DESPAWN, 0))
{
- Talk(ActiveBoat[m_uiActiveOrder[m_uiActivedNumber]].say);
- DoCast(me, SPELL_CHANNEL_YMIRON_TO_SPIRIT); // should be on spirit
- if (Creature* temp = me->SummonCreature(ActiveBoat[m_uiActiveOrder[m_uiActivedNumber]].npc, ActiveBoat[m_uiActiveOrder[m_uiActivedNumber]].SpawnX, ActiveBoat[m_uiActiveOrder[m_uiActivedNumber]].SpawnY, ActiveBoat[m_uiActiveOrder[m_uiActivedNumber]].SpawnZ, ActiveBoat[m_uiActiveOrder[m_uiActivedNumber]].SpawnO, TEMPSUMMON_CORPSE_DESPAWN, 0))
- {
- m_uiActivedCreatureGUID = temp->GetGUID();
- temp->CastSpell(me, SPELL_CHANNEL_SPIRIT_TO_YMIRON, true);
- temp->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_NOT_SELECTABLE);
- temp->SetDisableGravity(true);
- switch (m_uiActiveOrder[m_uiActivedNumber])
- {
- case 0: m_bIsActiveWithBJORN = true; break;
- case 1: m_bIsActiveWithHALDOR = true; break;
- case 2: m_bIsActiveWithRANULF = true; break;
- case 3: m_bIsActiveWithTORGYN = true; break;
- }
- }
-
- m_bIsPause = true;
- m_bIsWalking = false;
- m_uiPause_Timer = 3000;
- } else m_uiPause_Timer -= diff;
- return;
+ DoCast(ancestor, SPELL_CHANNEL_YMIRON_TO_SPIRIT);
+ ancestor->CastSpell(me, SPELL_CHANNEL_SPIRIT_TO_YMIRON, true);
+ ancestor->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_NOT_SELECTABLE);
+ ancestor->SetDisableGravity(true);
+ ActiveAncestorGUID = ancestor->GetGUID();
+ }
+ events.ScheduleEvent(EVENT_RESUME_COMBAT, 5000);
}
- else if (m_bIsPause)
+ }
+
+ void JustSummoned(Creature* summon) override
+ {
+ switch (summon->GetEntry())
{
- if (m_uiPause_Timer <= diff)
- {
- m_uiAbility_BJORN_Timer = 5000;
- m_uiAbility_HALDOR_Timer = 5000;
- m_uiAbility_RANULF_Timer = 5000;
- m_uiAbility_TORGYN_Timer = 5000;
-
- m_bIsPause = false;
- m_uiPause_Timer = 0;
- } else m_uiPause_Timer -= diff;
- return;
+ case NPC_SPIRIT_FOUNT:
+ summon->CastSpell(summon, SPELL_SPIRIT_FOUNT, true);
+ summon->SetDisplayId(11686);
+ SpiritFountGUID = summon->GetGUID();
+ break;
+ case NPC_AVENGING_SPIRIT:
+ if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0))
+ {
+ summon->AddThreat(target, 0.0f);
+ summon->AI()->AttackStart(target);
+ }
+ break;
+ default:
+ break;
}
- //Return since we have no target
- if (!UpdateVictim())
- return;
+ summons.Summon(summon);
+ }
- if (!m_bIsPause)
+ void DamageTaken(Unit* /*attacker*/, uint32& damage) override
+ {
+ if (me->HealthBelowPctDamaged(100 - HealthAmountMultipler * HealthAmountModifier, damage))
{
- // Normal spells ------------------------------------------------------------------------
- if (m_uiBane_Timer <= diff)
- {
- DoCast(me, SPELL_BANE);
- m_uiBane_Timer = urand(20000, 25000);
- } else m_uiBane_Timer -= diff;
+ uint8 Order = HealthAmountModifier - 1;
+ ++HealthAmountModifier;
- if (m_uiFetidRot_Timer <= diff)
- {
- DoCastVictim(SPELL_FETID_ROT);
- m_uiFetidRot_Timer = urand(10000, 15000);
- } else m_uiFetidRot_Timer -= diff;
+ me->InterruptNonMeleeSpells(true);
+ DoCast(me, SPELL_SCREAMS_OF_THE_DEAD);
- if (m_uiDarkSlash_Timer <= diff)
- {
- DoCastVictim(SPELL_DARK_SLASH);
- m_uiDarkSlash_Timer = urand(30000, 35000);
- } else m_uiDarkSlash_Timer -= diff;
+ me->AttackStop();
+ me->SetReactState(REACT_PASSIVE);
+ me->GetMotionMaster()->MovePoint(POINT_BOAT, ActiveBoat[ActiveOrder[Order]].MoveX, ActiveBoat[ActiveOrder[Order]].MoveY, ActiveBoat[ActiveOrder[Order]].MoveZ);
- if (m_uiAncestors_Vengeance_Timer <= diff)
- {
- DoCast(me, SPELL_ANCESTORS_VENGEANCE);
- m_uiAncestors_Vengeance_Timer = DUNGEON_MODE(urand(60000, 65000), urand(45000, 50000));
- } else m_uiAncestors_Vengeance_Timer -= diff;
+ DespawnBoatGhosts(ActiveAncestorGUID);
+ DespawnBoatGhosts(SpiritFountGUID);
- // Abilities ------------------------------------------------------------------------------
- if (m_bIsActiveWithBJORN && m_uiAbility_BJORN_Timer <= diff)
- {
- //DoCast(me, SPELL_SUMMON_SPIRIT_FOUNT); // works fine, but using summon has better control
- if (Creature* temp = me->SummonCreature(NPC_SPIRIT_FOUNT, 385.0f + rand32() % 10, -330.0f + rand32() % 10, 104.756f, 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 180000))
- {
- temp->SetSpeed(MOVE_RUN, 0.4f);
- temp->CastSpell(temp, SPELL_SPIRIT_FOUNT, true);
- temp->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_NOT_SELECTABLE);
- temp->SetDisplayId(11686);
- m_uiOrbGUID = temp->GetGUID();
- }
- m_bIsActiveWithBJORN = false; // only one orb
- } else m_uiAbility_BJORN_Timer -= diff;
+ events.CancelEvent(ActiveBoat[ActiveOrder[ActivedNumber]].event); // Cancels the event started on the previous transition.
+ events.DelayEvents(10000, EVENT_GROUP_BASE_SPELLS);
- if (m_bIsActiveWithHALDOR && m_uiAbility_HALDOR_Timer <= diff)
- {
- DoCastVictim(SPELL_SPIRIT_STRIKE);
- m_uiAbility_HALDOR_Timer = 5000; // overtime
- } else m_uiAbility_HALDOR_Timer -= diff;
+ ActivedNumber = Order;
+ }
+ }
- if (m_bIsActiveWithRANULF && m_uiAbility_RANULF_Timer <= diff)
- {
+ void ExecuteEvent(uint32 eventId) override
+ {
+ switch (eventId)
+ {
+ case EVENT_BANE:
+ DoCast(SPELL_BANE);
+ events.ScheduleEvent(EVENT_BANE, urand(20000, 25000));
+ break;
+ case EVENT_FETID_ROT:
+ DoCastVictim(SPELL_FETID_ROT);
+ events.ScheduleEvent(EVENT_FETID_ROT, urand(10000, 15000));
+ break;
+ case EVENT_DARK_SLASH:
+ DoCastVictim(SPELL_DARK_SLASH);
+ events.ScheduleEvent(EVENT_DARK_SLASH, urand(30000, 35000));
+ break;
+ case EVENT_ANCESTORS_VENGEANCE:
+ DoCast(me, SPELL_ANCESTORS_VENGEANCE);
+ events.ScheduleEvent(EVENT_ANCESTORS_VENGEANCE, DUNGEON_MODE(urand(60000, 65000), urand(45000, 50000)));
+ break;
+ case EVENT_RESUME_COMBAT:
+ me->SetReactState(REACT_AGGRESSIVE);
+ events.ScheduleEvent(ActiveBoat[ActiveOrder[ActivedNumber]].event, 5000);
+ break;
+ case EVENT_BJORN_SPIRIT_FOUNT:
+ DoCast(SPELL_SUMMON_SPIRIT_FOUNT);
+ break;
+ case EVENT_HALDOR_SPIRIT_STRIKE:
+ DoCastVictim(SPELL_SPIRIT_STRIKE);
+ events.ScheduleEvent(EVENT_HALDOR_SPIRIT_STRIKE, 5000);
+ break;
+ case EVENT_RANULF_SPIRIT_BURST:
DoCast(me, SPELL_SPIRIT_BURST);
- m_uiAbility_RANULF_Timer = 10000; // overtime
- } else m_uiAbility_RANULF_Timer -= diff;
-
- if (m_bIsActiveWithTORGYN && m_uiAbility_TORGYN_Timer <= diff)
- {
- float x, y, z;
- x = me->GetPositionX()-5;
- y = me->GetPositionY()-5;
- z = me->GetPositionZ();
+ events.ScheduleEvent(EVENT_RANULF_SPIRIT_BURST, 10000);
+ break;
+ case EVENT_TORGYN_SUMMON_AVENGING_SPIRITS:
for (uint8 i = 0; i < 4; ++i)
- {
- //DoCast(me, SPELL_SUMMON_AVENGING_SPIRIT); // works fine, but using summon has better control
- if (Creature* temp = me->SummonCreature(NPC_AVENGING_SPIRIT, x + rand32() % 10, y + rand32() % 10, z, 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000))
- {
- if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0))
- {
- temp->AddThreat(target, 0.0f);
- temp->AI()->AttackStart(target);
- }
- }
- }
- m_uiAbility_TORGYN_Timer = 15000; // overtime
- } else m_uiAbility_TORGYN_Timer -= diff;
-
- // Health check -----------------------------------------------------------------------------
- if (me->HealthBelowPct(100 - m_uiHealthAmountMultipler * m_uiHealthAmountModifier))
- {
- uint8 m_uiOrder = m_uiHealthAmountModifier - 1;
- ++m_uiHealthAmountModifier;
-
- me->InterruptNonMeleeSpells(true);
- DoCast(me, SPELL_SCREAMS_OF_THE_DEAD);
- me->GetMotionMaster()->Clear();
- me->StopMoving();
- me->AttackStop();
- me->GetMotionMaster()->MovePoint(0, ActiveBoat[m_uiActiveOrder[m_uiOrder]].MoveX, ActiveBoat[m_uiActiveOrder[m_uiOrder]].MoveY, ActiveBoat[m_uiActiveOrder[m_uiOrder]].MoveZ);
-
- DespawnBoatGhosts(m_uiActivedCreatureGUID);
- DespawnBoatGhosts(m_uiOrbGUID);
-
- m_bIsActiveWithBJORN = false;
- m_bIsActiveWithHALDOR = false;
- m_bIsActiveWithRANULF = false;
- m_bIsActiveWithTORGYN = false;
-
- m_uiBane_Timer += 8000;
- m_uiFetidRot_Timer += 8000;
- m_uiDarkSlash_Timer += 8000;
- m_uiAncestors_Vengeance_Timer += 8000;
-
- m_uiActivedNumber = m_uiOrder;
- m_bIsWalking = true;
- m_uiPause_Timer = 2000;
- return;
- }
- DoMeleeAttackIfReady();
+ DoCast(SPELL_SUMMON_AVENGING_SPIRIT);
+ events.ScheduleEvent(EVENT_TORGYN_SUMMON_AVENGING_SPIRITS, 15000);
+ break;
+ default:
+ break;
}
}
@@ -361,14 +283,24 @@ public:
Talk(SAY_SLAY);
}
- void DespawnBoatGhosts(ObjectGuid& m_uiCreatureGUID)
+ void DespawnBoatGhosts(ObjectGuid& CreatureGUID)
{
- if (m_uiCreatureGUID)
- if (Creature* temp = ObjectAccessor::GetCreature(*me, m_uiCreatureGUID))
+ // @todo: fire visual after ancestor despawns.
+ if (CreatureGUID)
+ if (Creature* temp = ObjectAccessor::GetCreature(*me, CreatureGUID))
temp->DisappearAndDie();
- m_uiCreatureGUID.Clear();
+ CreatureGUID.Clear();
}
+
+ private:
+ bool kingsBane; // Achievement King's Bane
+ uint8 ActiveOrder[4];
+ uint8 ActivedNumber;
+ uint32 HealthAmountModifier;
+ uint32 HealthAmountMultipler;
+ ObjectGuid ActiveAncestorGUID;
+ ObjectGuid SpiritFountGUID;
};
CreatureAI* GetAI(Creature* creature) const override
diff --git a/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/utgarde_pinnacle.h b/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/utgarde_pinnacle.h
index cccfcede80b..5373446ba02 100644
--- a/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/utgarde_pinnacle.h
+++ b/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/utgarde_pinnacle.h
@@ -59,7 +59,19 @@ enum CreatureIds
NPC_RAVENOUS_FURBOLG = 26684,
NPC_MASSIVE_JORMUNGAR = 26685,
NPC_FEROCIOUS_RHINO = 26686,
- NPC_PALEHOOF_ORB = 26688
+ NPC_PALEHOOF_ORB = 26688,
+
+ // Ymiron
+ NPC_BJORN = 27303,
+ NPC_BJORN_VISUAL = 27304,
+ NPC_HALDOR = 27307,
+ NPC_HALDOR_VISUAL = 27310,
+ NPC_RANULF = 27308,
+ NPC_RANULF_VISUAL = 27311,
+ NPC_TORGYN = 27309,
+ NPC_TORGYN_VISUAL = 27312,
+ NPC_SPIRIT_FOUNT = 27339,
+ NPC_AVENGING_SPIRIT = 27386
};
enum GameObjectIds
diff --git a/src/server/scripts/Northrend/VaultOfArchavon/boss_emalon.cpp b/src/server/scripts/Northrend/VaultOfArchavon/boss_emalon.cpp
index 1118af13777..bacb63b73bc 100644
--- a/src/server/scripts/Northrend/VaultOfArchavon/boss_emalon.cpp
+++ b/src/server/scripts/Northrend/VaultOfArchavon/boss_emalon.cpp
@@ -184,13 +184,19 @@ class npc_tempest_minion : public CreatureScript
{
npc_tempest_minionAI(Creature* creature) : ScriptedAI(creature)
{
+ Initialize();
instance = creature->GetInstanceScript();
}
+ void Initialize()
+ {
+ OverchargedTimer = 0;
+ }
+
void Reset() override
{
events.Reset();
- OverchargedTimer = 0;
+ Initialize();
}
void JustDied(Unit* /*killer*/) override
diff --git a/src/server/scripts/Northrend/VaultOfArchavon/boss_toravon.cpp b/src/server/scripts/Northrend/VaultOfArchavon/boss_toravon.cpp
index 9f9d5104d7d..a7895b8d506 100644
--- a/src/server/scripts/Northrend/VaultOfArchavon/boss_toravon.cpp
+++ b/src/server/scripts/Northrend/VaultOfArchavon/boss_toravon.cpp
@@ -185,14 +185,20 @@ public:
{
npc_frozen_orbAI(Creature* creature) : ScriptedAI(creature)
{
+ Initialize();
}
- void Reset() override
+ void Initialize()
{
done = false;
killTimer = 60000; // if after this time there is no victim -> destroy!
}
+ void Reset() override
+ {
+ Initialize();
+ }
+
void EnterCombat(Unit* /*who*/) override
{
DoZoneInCombat();
diff --git a/src/server/scripts/Northrend/VioletHold/boss_cyanigosa.cpp b/src/server/scripts/Northrend/VioletHold/boss_cyanigosa.cpp
index cca2b347af7..5857f695023 100644
--- a/src/server/scripts/Northrend/VioletHold/boss_cyanigosa.cpp
+++ b/src/server/scripts/Northrend/VioletHold/boss_cyanigosa.cpp
@@ -57,9 +57,19 @@ public:
{
boss_cyanigosaAI(Creature* creature) : ScriptedAI(creature)
{
+ Initialize();
instance = creature->GetInstanceScript();
}
+ void Initialize()
+ {
+ uiArcaneVacuumTimer = 10000;
+ uiBlizzardTimer = 15000;
+ uiManaDestructionTimer = 30000;
+ uiTailSweepTimer = 20000;
+ uiUncontrollableEnergyTimer = 25000;
+ }
+
uint32 uiArcaneVacuumTimer;
uint32 uiBlizzardTimer;
uint32 uiManaDestructionTimer;
@@ -70,11 +80,7 @@ public:
void Reset() override
{
- uiArcaneVacuumTimer = 10000;
- uiBlizzardTimer = 15000;
- uiManaDestructionTimer = 30000;
- uiTailSweepTimer = 20000;
- uiUncontrollableEnergyTimer = 25000;
+ Initialize();
instance->SetData(DATA_CYANIGOSA_EVENT, NOT_STARTED);
}
diff --git a/src/server/scripts/Northrend/VioletHold/boss_erekem.cpp b/src/server/scripts/Northrend/VioletHold/boss_erekem.cpp
index 87d34efe74f..bbb8c758bb1 100644
--- a/src/server/scripts/Northrend/VioletHold/boss_erekem.cpp
+++ b/src/server/scripts/Northrend/VioletHold/boss_erekem.cpp
@@ -56,9 +56,19 @@ public:
{
boss_erekemAI(Creature* creature) : ScriptedAI(creature)
{
+ Initialize();
instance = creature->GetInstanceScript();
}
+ void Initialize()
+ {
+ uiBloodlustTimer = 15000;
+ uiChainHealTimer = 0;
+ uiEarthShockTimer = urand(2000, 8000);
+ uiLightningBoltTimer = urand(5000, 10000);
+ uiEarthShieldTimer = 20000;
+ }
+
uint32 uiBloodlustTimer;
uint32 uiChainHealTimer;
uint32 uiEarthShockTimer;
@@ -69,11 +79,7 @@ public:
void Reset() override
{
- uiBloodlustTimer = 15000;
- uiChainHealTimer = 0;
- uiEarthShockTimer = urand(2000, 8000);
- uiLightningBoltTimer = urand(5000, 10000);
- uiEarthShieldTimer = 20000;
+ Initialize();
if (instance->GetData(DATA_WAVE_COUNT) == 6)
instance->SetData(DATA_1ST_BOSS_EVENT, NOT_STARTED);
else if (instance->GetData(DATA_WAVE_COUNT) == 12)
@@ -264,9 +270,17 @@ public:
{
npc_erekem_guardAI(Creature* creature) : ScriptedAI(creature)
{
+ Initialize();
instance = creature->GetInstanceScript();
}
+ void Initialize()
+ {
+ uiStrikeTimer = urand(4000, 8000);
+ uiHowlingScreechTimer = urand(8000, 13000);
+ uiGushingWoundTimer = urand(1000, 3000);
+ }
+
uint32 uiGushingWoundTimer;
uint32 uiHowlingScreechTimer;
uint32 uiStrikeTimer;
@@ -275,9 +289,7 @@ public:
void Reset() override
{
- uiStrikeTimer = urand(4000, 8000);
- uiHowlingScreechTimer = urand(8000, 13000);
- uiGushingWoundTimer = urand(1000, 3000);
+ Initialize();
}
void AttackStart(Unit* who) override
diff --git a/src/server/scripts/Northrend/VioletHold/boss_ichoron.cpp b/src/server/scripts/Northrend/VioletHold/boss_ichoron.cpp
index d556d19f670..50a65920876 100644
--- a/src/server/scripts/Northrend/VioletHold/boss_ichoron.cpp
+++ b/src/server/scripts/Northrend/VioletHold/boss_ichoron.cpp
@@ -85,9 +85,19 @@ public:
{
boss_ichoronAI(Creature* creature) : ScriptedAI(creature), m_waterElements(creature)
{
+ Initialize();
instance = creature->GetInstanceScript();
}
+ void Initialize()
+ {
+ bIsExploded = false;
+ bIsFrenzy = false;
+ dehydration = true;
+ uiBubbleCheckerTimer = 1000;
+ uiWaterBoltVolleyTimer = urand(10000, 15000);
+ }
+
bool bIsExploded;
bool bIsFrenzy;
bool dehydration;
@@ -101,11 +111,7 @@ public:
void Reset() override
{
- bIsExploded = false;
- bIsFrenzy = false;
- dehydration = true;
- uiBubbleCheckerTimer = 1000;
- uiWaterBoltVolleyTimer = urand(10000, 15000);
+ Initialize();
me->SetVisible(true);
DespawnWaterElements();
@@ -340,16 +346,22 @@ public:
{
npc_ichor_globuleAI(Creature* creature) : ScriptedAI(creature)
{
+ Initialize();
instance = creature->GetInstanceScript();
}
+ void Initialize()
+ {
+ uiRangeCheck_Timer = 1000;
+ }
+
InstanceScript* instance;
uint32 uiRangeCheck_Timer;
void Reset() override
{
- uiRangeCheck_Timer = 1000;
+ Initialize();
DoCast(me, SPELL_WATER_GLOBULE);
}
diff --git a/src/server/scripts/Northrend/zone_sholazar_basin.cpp b/src/server/scripts/Northrend/zone_sholazar_basin.cpp
index 203bf6f1be6..53fe1500624 100644
--- a/src/server/scripts/Northrend/zone_sholazar_basin.cpp
+++ b/src/server/scripts/Northrend/zone_sholazar_basin.cpp
@@ -977,15 +977,15 @@ public:
void HandleScript(SpellEffIndex /*effIndex*/)
{
- if (Player* player = GetHitUnit()->ToPlayer())
+ if (Unit* target = GetHitUnit())
{
switch (GetSpellInfo()->Id)
{
case SPELL_CORRECT_TRACKS:
- player->MonsterSay(sObjectMgr->GetTrinityStringForDBCLocale(SAY_CORRECT_TRACKS), LANG_UNIVERSAL, player);
+ target->Say(SAY_CORRECT_TRACKS, target);
break;
case SPELL_INCORRECT_TRACKS:
- player->MonsterSay(sObjectMgr->GetTrinityStringForDBCLocale(SAY_INCORRECT_TRACKS), LANG_UNIVERSAL, player);
+ target->Say(SAY_INCORRECT_TRACKS, target);
break;
default:
break;
diff --git a/src/server/scripts/Outland/BlackTemple/boss_illidan.cpp b/src/server/scripts/Outland/BlackTemple/boss_illidan.cpp
index 3f08ecad7b7..4ec6aed9655 100644
--- a/src/server/scripts/Outland/BlackTemple/boss_illidan.cpp
+++ b/src/server/scripts/Outland/BlackTemple/boss_illidan.cpp
@@ -31,8 +31,6 @@ EndScriptData */
#include "Player.h"
#include "SpellInfo.h"
-#define EMOTE_UNABLE_TO_SUMMON "%s is unable to summon Maiev Shadowsong and enter Phase 4. Resetting Encounter."
-
// Other defines
#define CENTER_X 676.740f
#define CENTER_Y 305.297f
@@ -604,7 +602,7 @@ public:
if (Conversation[count].emote)
creature->HandleEmoteCommand(Conversation[count].emote); // Make the Creature do some animation!
if (Conversation[count].text.size())
- creature->MonsterYell(Conversation[count].text.c_str(), LANG_UNIVERSAL, NULL); // Have the Creature yell out some text
+ creature->Yell(Conversation[count].text.c_str(), LANG_UNIVERSAL); // Have the Creature yell out some text
if (Conversation[count].sound)
DoPlaySoundToSet(creature, Conversation[count].sound); // Play some sound on the creature
}
@@ -760,7 +758,6 @@ public:
if (!MaievGUID) // If Maiev cannot be summoned, reset the encounter and post some errors to the console.
{
EnterEvadeMode();
- me->MonsterTextEmote(EMOTE_UNABLE_TO_SUMMON, NULL);
TC_LOG_ERROR("scripts", "SD2 ERROR: Unable to summon Maiev Shadowsong (entry: 23197). Check your database to see if you have the proper SQL for Maiev Shadowsong (entry: 23197)");
}
}
diff --git a/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_fathomlord_karathress.cpp b/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_fathomlord_karathress.cpp
index 83b8b1847b5..05db2c12b90 100644
--- a/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_fathomlord_karathress.cpp
+++ b/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_fathomlord_karathress.cpp
@@ -278,7 +278,7 @@ public:
if (continueTriggering)
{
DoCast(me, SPELL_BLESSING_OF_THE_TIDES);
- me->MonsterYell(SAY_GAIN_BLESSING_OF_TIDES, LANG_UNIVERSAL, NULL);
+ me->Yell(SAY_GAIN_BLESSING_OF_TIDES, LANG_UNIVERSAL);
DoPlaySoundToSet(me, SOUND_GAIN_BLESSING_OF_TIDES);
}
}
diff --git a/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_lurker_below.cpp b/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_lurker_below.cpp
index a0ff469733c..83b8722ce47 100644
--- a/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_lurker_below.cpp
+++ b/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_lurker_below.cpp
@@ -234,7 +234,7 @@ public:
if (SpoutTimer <= diff)
{
- me->MonsterTextEmote(EMOTE_SPOUT, NULL, true);
+ me->TextEmote(EMOTE_SPOUT, nullptr, true);
me->SetReactState(REACT_PASSIVE);
me->GetMotionMaster()->MoveRotate(20000, urand(0, 1) ? ROTATE_DIRECTION_LEFT : ROTATE_DIRECTION_RIGHT);
SpoutTimer = 45000;
diff --git a/src/server/scripts/Outland/HellfireCitadel/HellfireRamparts/boss_watchkeeper_gargolmar.cpp b/src/server/scripts/Outland/HellfireCitadel/HellfireRamparts/boss_watchkeeper_gargolmar.cpp
index 82f101980fe..5baaebc0d7b 100644
--- a/src/server/scripts/Outland/HellfireCitadel/HellfireRamparts/boss_watchkeeper_gargolmar.cpp
+++ b/src/server/scripts/Outland/HellfireCitadel/HellfireRamparts/boss_watchkeeper_gargolmar.cpp
@@ -40,7 +40,6 @@ enum Says
enum Spells
{
SPELL_MORTAL_WOUND = 30641,
- H_SPELL_MORTAL_WOUND = 36814,
SPELL_SURGE = 34645,
SPELL_RETALIATION = 22857
};
@@ -78,7 +77,6 @@ class boss_watchkeeper_gargolmar : public CreatureScript
}
void MoveInLineOfSight(Unit* who) override
-
{
if (!me->GetVictim() && me->CanCreatureAttack(who))
{
diff --git a/src/server/scripts/Outland/HellfireCitadel/MagtheridonsLair/instance_magtheridons_lair.cpp b/src/server/scripts/Outland/HellfireCitadel/MagtheridonsLair/instance_magtheridons_lair.cpp
index 7951e25d675..db0159d1a2d 100644
--- a/src/server/scripts/Outland/HellfireCitadel/MagtheridonsLair/instance_magtheridons_lair.cpp
+++ b/src/server/scripts/Outland/HellfireCitadel/MagtheridonsLair/instance_magtheridons_lair.cpp
@@ -176,7 +176,7 @@ class instance_magtheridons_lair : public InstanceMapScript
Creature* Magtheridon = instance->GetCreature(MagtheridonGUID);
if (Magtheridon && Magtheridon->IsAlive())
{
- Magtheridon->MonsterTextEmote(EMOTE_BONDS_WEAKEN, NULL);
+ Magtheridon->TextEmote(EMOTE_BONDS_WEAKEN);
CageTimer = 120000;
}
HandleGameObject(DoorGUID, false);
diff --git a/src/server/scripts/Spells/spell_generic.cpp b/src/server/scripts/Spells/spell_generic.cpp
index e96e325b933..e5ef3d5b7b7 100644
--- a/src/server/scripts/Spells/spell_generic.cpp
+++ b/src/server/scripts/Spells/spell_generic.cpp
@@ -3682,6 +3682,37 @@ class spell_gen_gm_freeze : public SpellScriptLoader
}
};
+class spell_gen_stand : public SpellScriptLoader
+{
+public:
+ spell_gen_stand() : SpellScriptLoader("spell_gen_stand") { }
+
+ class spell_gen_stand_SpellScript : public SpellScript
+ {
+ PrepareSpellScript(spell_gen_stand_SpellScript);
+
+ void HandleScript(SpellEffIndex /*eff*/)
+ {
+ Creature* target = GetHitCreature();
+ if (!target)
+ return;
+
+ target->SetByteValue(UNIT_FIELD_BYTES_1, 0, UNIT_STAND_STATE_STAND);
+ target->HandleEmoteCommand(EMOTE_STATE_NONE);
+ }
+
+ void Register() override
+ {
+ OnEffectHitTarget += SpellEffectFn(spell_gen_stand_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT);
+ }
+ };
+
+ SpellScript* GetSpellScript() const override
+ {
+ return new spell_gen_stand_SpellScript();
+ }
+};
+
void AddSC_generic_spell_scripts()
{
new spell_gen_absorb0_hitlimit1();
@@ -3763,4 +3794,5 @@ void AddSC_generic_spell_scripts()
new spell_gen_whisper_gulch_yogg_saron_whisper();
new spell_gen_eject_all_passengers();
new spell_gen_gm_freeze();
+ new spell_gen_stand();
}
diff --git a/src/server/scripts/Spells/spell_quest.cpp b/src/server/scripts/Spells/spell_quest.cpp
index 28a16e2f1d3..00ce2cb280e 100644
--- a/src/server/scripts/Spells/spell_quest.cpp
+++ b/src/server/scripts/Spells/spell_quest.cpp
@@ -280,8 +280,8 @@ class spell_q11396_11399_force_shield_arcane_purple_x3 : public SpellScriptLoade
void HandleEffectApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
{
Unit* target = GetTarget();
- target->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC);
- target->AddUnitState(UNIT_STATE_ROOT);
+ target->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC);
+ target->AddUnitState(UNIT_STATE_ROOT);
}
void HandleEffectRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
@@ -1777,7 +1777,7 @@ class spell_q12847_summon_soul_moveto_bunny : public SpellScriptLoader
}
};
- SpellScript *GetSpellScript() const override
+ SpellScript* GetSpellScript() const override
{
return new spell_q12847_summon_soul_moveto_bunny_SpellScript();
}