diff options
Diffstat (limited to 'src/server/scripts')
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(); } |
