diff options
Diffstat (limited to 'src/server/scripts')
119 files changed, 1663 insertions, 1484 deletions
diff --git a/src/server/scripts/Commands/cs_ban.cpp b/src/server/scripts/Commands/cs_ban.cpp index c32a03f9bd8..aa90c21c995 100644 --- a/src/server/scripts/Commands/cs_ban.cpp +++ b/src/server/scripts/Commands/cs_ban.cpp @@ -114,9 +114,19 @@ public: case BAN_SUCCESS: { if (atoi(durationStr) > 0) - handler->PSendSysMessage(LANG_BAN_YOUBANNED, name.c_str(), secsToTimeString(TimeStringToSecs(durationStr), true).c_str(), reasonStr); + { + if (sWorld->getBoolConfig(CONFIG_SHOW_BAN_IN_WORLD)) + sWorld->SendWorldText(LANG_BAN_CHARACTER_YOUBANNEDMESSAGE_WORLD, (handler->GetSession() ? handler->GetSession()->GetPlayerName().c_str() : "Server"), name.c_str(), secsToTimeString(TimeStringToSecs(durationStr), true).c_str(), reasonStr); + else + handler->PSendSysMessage(LANG_BAN_YOUBANNED, name.c_str(), secsToTimeString(TimeStringToSecs(durationStr), true).c_str(), reasonStr); + } else - handler->PSendSysMessage(LANG_BAN_YOUPERMBANNED, name.c_str(), reasonStr); + { + if (sWorld->getBoolConfig(CONFIG_SHOW_BAN_IN_WORLD)) + sWorld->SendWorldText(LANG_BAN_CHARACTER_YOUPERMBANNEDMESSAGE_WORLD, (handler->GetSession() ? handler->GetSession()->GetPlayerName().c_str() : "Server"), name.c_str(), reasonStr); + else + handler->PSendSysMessage(LANG_BAN_YOUPERMBANNED, name.c_str(), reasonStr); + } break; } case BAN_NOTFOUND: @@ -189,9 +199,19 @@ public: { case BAN_SUCCESS: if (atoi(durationStr) > 0) - handler->PSendSysMessage(LANG_BAN_YOUBANNED, nameOrIP.c_str(), secsToTimeString(TimeStringToSecs(durationStr), true).c_str(), reasonStr); + { + if (sWorld->getBoolConfig(CONFIG_SHOW_BAN_IN_WORLD)) + sWorld->SendWorldText(LANG_BAN_ACCOUNT_YOUBANNEDMESSAGE_WORLD, (handler->GetSession() ? handler->GetSession()->GetPlayerName().c_str() : "Server"), nameOrIP.c_str(), secsToTimeString(TimeStringToSecs(durationStr), true).c_str(), reasonStr); + else + handler->PSendSysMessage(LANG_BAN_YOUBANNED, nameOrIP.c_str(), secsToTimeString(TimeStringToSecs(durationStr), true).c_str(), reasonStr); + } else - handler->PSendSysMessage(LANG_BAN_YOUPERMBANNED, nameOrIP.c_str(), reasonStr); + { + if (sWorld->getBoolConfig(CONFIG_SHOW_BAN_IN_WORLD)) + sWorld->SendWorldText(LANG_BAN_ACCOUNT_YOUPERMBANNEDMESSAGE_WORLD, (handler->GetSession() ? handler->GetSession()->GetPlayerName().c_str() : "Server"), nameOrIP.c_str(), reasonStr); + else + handler->PSendSysMessage(LANG_BAN_YOUPERMBANNED, nameOrIP.c_str(), reasonStr); + } break; case BAN_SYNTAX_ERROR: return false; diff --git a/src/server/scripts/Commands/cs_gm.cpp b/src/server/scripts/Commands/cs_gm.cpp index 55e22a8c99a..498ee68ba11 100644 --- a/src/server/scripts/Commands/cs_gm.cpp +++ b/src/server/scripts/Commands/cs_gm.cpp @@ -198,33 +198,34 @@ public: //Enable\Disable Invisible mode static bool HandleGMVisibleCommand(ChatHandler* handler, char const* args) { + Player* _player = handler->GetSession()->GetPlayer(); + if (!*args) { - handler->PSendSysMessage(LANG_YOU_ARE, handler->GetSession()->GetPlayer()->isGMVisible() ? handler->GetTrinityString(LANG_VISIBLE) : handler->GetTrinityString(LANG_INVISIBLE)); + handler->PSendSysMessage(LANG_YOU_ARE, _player->isGMVisible() ? handler->GetTrinityString(LANG_VISIBLE) : handler->GetTrinityString(LANG_INVISIBLE)); return true; } const uint32 VISUAL_AURA = 37800; std::string param = (char*)args; - Player* player = handler->GetSession()->GetPlayer(); if (param == "on") { - if (player->HasAura(VISUAL_AURA, 0)) - player->RemoveAurasDueToSpell(VISUAL_AURA); + if (_player->HasAura(VISUAL_AURA, 0)) + _player->RemoveAurasDueToSpell(VISUAL_AURA); - player->SetGMVisible(true); + _player->SetGMVisible(true); + _player->UpdateObjectVisibility(); handler->GetSession()->SendNotification(LANG_INVISIBLE_VISIBLE); return true; } if (param == "off") { + _player->AddAura(VISUAL_AURA, _player); + _player->SetGMVisible(false); + _player->UpdateObjectVisibility(); handler->GetSession()->SendNotification(LANG_INVISIBLE_INVISIBLE); - player->SetGMVisible(false); - - player->AddAura(VISUAL_AURA, player); - return true; } @@ -236,12 +237,11 @@ public: //Enable\Disable GM Mode static bool HandleGMCommand(ChatHandler* handler, char const* args) { + Player* _player = handler->GetSession()->GetPlayer(); + if (!*args) { - if (handler->GetSession()->GetPlayer()->IsGameMaster()) - handler->GetSession()->SendNotification(LANG_GM_ON); - else - handler->GetSession()->SendNotification(LANG_GM_OFF); + handler->GetSession()->SendNotification(_player->IsGameMaster() ? LANG_GM_ON : LANG_GM_OFF); return true; } @@ -249,9 +249,9 @@ public: if (param == "on") { - handler->GetSession()->GetPlayer()->SetGameMaster(true); + _player->SetGameMaster(true); handler->GetSession()->SendNotification(LANG_GM_ON); - handler->GetSession()->GetPlayer()->UpdateTriggerVisibility(); + _player->UpdateTriggerVisibility(); #ifdef _DEBUG_VMAPS VMAP::IVMapManager* vMapManager = VMAP::VMapFactory::createOrGetVMapManager(); vMapManager->processCommand("stoplog"); @@ -261,9 +261,9 @@ public: if (param == "off") { - handler->GetSession()->GetPlayer()->SetGameMaster(false); + _player->SetGameMaster(false); handler->GetSession()->SendNotification(LANG_GM_OFF); - handler->GetSession()->GetPlayer()->UpdateTriggerVisibility(); + _player->UpdateTriggerVisibility(); #ifdef _DEBUG_VMAPS VMAP::IVMapManager* vMapManager = VMAP::VMapFactory::createOrGetVMapManager(); vMapManager->processCommand("startlog"); diff --git a/src/server/scripts/Commands/cs_misc.cpp b/src/server/scripts/Commands/cs_misc.cpp index 796416b4031..6de8a155d01 100644 --- a/src/server/scripts/Commands/cs_misc.cpp +++ b/src/server/scripts/Commands/cs_misc.cpp @@ -94,6 +94,7 @@ public: { "unpossess", rbac::RBAC_PERM_COMMAND_UNPOSSESS, false, &HandleUnPossessCommand, "", NULL }, { "unstuck", rbac::RBAC_PERM_COMMAND_UNSTUCK, true, &HandleUnstuckCommand, "", NULL }, { "wchange", rbac::RBAC_PERM_COMMAND_WCHANGE, false, &HandleChangeWeather, "", NULL }, + { "mailbox", rbac::RBAC_PERM_COMMAND_MAILBOX, false, &HandleMailBoxCommand, "", NULL }, { NULL, 0, false, NULL, "", NULL } }; return commandTable; @@ -808,8 +809,13 @@ public: if (handler->HasLowerSecurity(target, 0)) return false; + char const* kickReason = strtok(NULL, "\r"); + std::string kickReasonStr = "No reason"; + if (kickReason != NULL) + kickReasonStr = kickReason; + if (sWorld->getBoolConfig(CONFIG_SHOW_KICK_IN_WORLD)) - sWorld->SendWorldText(LANG_COMMAND_KICKMESSAGE, playerName.c_str()); + sWorld->SendWorldText(LANG_COMMAND_KICKMESSAGE_WORLD, (handler->GetSession() ? handler->GetSession()->GetPlayerName().c_str() : "Server"), playerName.c_str(), kickReasonStr.c_str()); else handler->PSendSysMessage(LANG_COMMAND_KICKMESSAGE, playerName.c_str()); @@ -1333,23 +1339,20 @@ public: return false; } - std::string tNameLink = handler->GetNameLink(target); - - if (!target->GetSkillValue(skill)) - { - handler->PSendSysMessage(LANG_SET_SKILL_ERROR, tNameLink.c_str(), skill, skillLine->name[handler->GetSessionDbcLocale()]); - handler->SetSentErrorMessage(true); - return false; - } + bool targetHasSkill = target->GetSkillValue(skill); - uint16 max = maxPureSkill ? atol (maxPureSkill) : target->GetPureMaxSkillValue(skill); + // If our target does not yet have the skill they are trying to add to them, the chosen level also becomes + // the max level of the new profession. + uint16 max = maxPureSkill ? atol (maxPureSkill) : targetHasSkill ? target->GetPureMaxSkillValue(skill) : uint16(level); if (level <= 0 || level > max || max <= 0) return false; - target->SetSkill(skill, target->GetSkillStep(skill), level, max); - handler->PSendSysMessage(LANG_SET_SKILL, skill, skillLine->name[handler->GetSessionDbcLocale()], tNameLink.c_str(), level, max); - + // If the player has the skill, we get the current skill step. If they don't have the skill, we + // add the skill to the player's book with step 1 (which is the first rank, in most cases something + // like 'Apprentice <skill>'. + target->SetSkill(skill, targetHasSkill ? target->GetSkillStep(skill) : 1, level, max); + handler->PSendSysMessage(LANG_SET_SKILL, skill, skillLine->name[handler->GetSessionDbcLocale()], handler->GetNameLink(target).c_str(), level, max); return true; } @@ -1835,7 +1838,17 @@ public: int64 muteTime = time(NULL) + notSpeakTime * MINUTE; target->GetSession()->m_muteTime = muteTime; stmt->setInt64(0, muteTime); - ChatHandler(target->GetSession()).PSendSysMessage(LANG_YOUR_CHAT_DISABLED, notSpeakTime, muteBy.c_str(), muteReasonStr.c_str()); + std::string nameLink = handler->playerLink(targetName); + + if (sWorld->getBoolConfig(CONFIG_SHOW_MUTE_IN_WORLD)) + { + sWorld->SendWorldText(LANG_COMMAND_MUTEMESSAGE_WORLD, (handler->GetSession() ? handler->GetSession()->GetPlayerName().c_str() : "Server"), nameLink.c_str(), notSpeakTime, muteReasonStr.c_str()); + ChatHandler(target->GetSession()).PSendSysMessage(LANG_YOUR_CHAT_DISABLED, notSpeakTime, muteBy.c_str(), muteReasonStr.c_str()); + } + else + { + ChatHandler(target->GetSession()).PSendSysMessage(LANG_YOUR_CHAT_DISABLED, notSpeakTime, muteBy.c_str(), muteReasonStr.c_str()); + } } else { @@ -1850,8 +1863,10 @@ public: LoginDatabase.Execute(stmt); std::string nameLink = handler->playerLink(targetName); - handler->PSendSysMessage(target ? LANG_YOU_DISABLE_CHAT : LANG_COMMAND_DISABLE_CHAT_DELAYED, nameLink.c_str(), notSpeakTime, muteReasonStr.c_str()); - + if (sWorld->getBoolConfig(CONFIG_SHOW_MUTE_IN_WORLD) && !target) + sWorld->SendWorldText(LANG_COMMAND_MUTEMESSAGE_WORLD, handler->GetSession()->GetPlayerName().c_str(), nameLink.c_str(), notSpeakTime, muteReasonStr.c_str()); + else + handler->PSendSysMessage(target ? LANG_YOU_DISABLE_CHAT : LANG_COMMAND_DISABLE_CHAT_DELAYED, nameLink.c_str(), notSpeakTime, muteReasonStr.c_str()); return true; } @@ -2464,6 +2479,14 @@ public: player->StopCastingBindSight(); return true; } + + static bool HandleMailBoxCommand(ChatHandler* handler, char const* /*args*/) + { + Player* player = handler->GetSession()->GetPlayer(); + + handler->GetSession()->SendShowMailBox(player->GetGUID()); + return true; + } }; void AddSC_misc_commandscript() diff --git a/src/server/scripts/Commands/cs_npc.cpp b/src/server/scripts/Commands/cs_npc.cpp index c25002fe4f4..a5b13301403 100644 --- a/src/server/scripts/Commands/cs_npc.cpp +++ b/src/server/scripts/Commands/cs_npc.cpp @@ -744,7 +744,7 @@ public: for (uint8 i = 0; i < NPCFLAG_COUNT; i++) if (npcflags & npcFlagTexts[i].Value) - handler->PSendSysMessage(npcFlagTexts[i].Name); + handler->PSendSysMessage(npcFlagTexts[i].Name, npcFlagTexts[i].Value); handler->PSendSysMessage(LANG_NPCINFO_MECHANIC_IMMUNE, mechanicImmuneMask); for (uint8 i = 0; i < MAX_MECHANIC; ++i) diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_emperor_dagran_thaurissan.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_emperor_dagran_thaurissan.cpp index 845db0cac1c..1edb1100289 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_emperor_dagran_thaurissan.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_emperor_dagran_thaurissan.cpp @@ -74,7 +74,7 @@ public: void JustDied(Unit* /*killer*/) OVERRIDE { - if (Creature* Moira = ObjectAccessor::GetCreature(*me, instance ? instance->GetData64(DATA_MOIRA) : 0)) + if (Creature* Moira = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_MOIRA))) { Moira->AI()->EnterEvadeMode(); Moira->setFaction(35); diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_rend_blackhand.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_rend_blackhand.cpp index fe38377341b..8989a8065dc 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_rend_blackhand.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_rend_blackhand.cpp @@ -191,7 +191,7 @@ public: void SetData(uint32 type, uint32 data) OVERRIDE { - if (instance && type == AREATRIGGER && data == AREATRIGGER_BLACKROCK_STADIUM) + if (type == AREATRIGGER && data == AREATRIGGER_BLACKROCK_STADIUM) { if (!gythEvent) { diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_chromaggus.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_chromaggus.cpp index d292e5f7701..3930656f0e1 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_chromaggus.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_chromaggus.cpp @@ -183,7 +183,7 @@ public: void EnterCombat(Unit* /*who*/) OVERRIDE { - if (instance && instance->GetBossState(BOSS_FLAMEGOR) != DONE) + if (instance->GetBossState(BOSS_FLAMEGOR) != DONE) { EnterEvadeMode(); return; diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_ebonroc.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_ebonroc.cpp index b8a3c157c52..8d25fe117fe 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_ebonroc.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_ebonroc.cpp @@ -45,7 +45,7 @@ public: void EnterCombat(Unit* /*who*/) OVERRIDE { - if (instance && instance->GetBossState(BOSS_BROODLORD) != DONE) + if (instance->GetBossState(BOSS_BROODLORD) != DONE) { EnterEvadeMode(); return; diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_firemaw.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_firemaw.cpp index 706f376e882..cbd625e852a 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_firemaw.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_firemaw.cpp @@ -45,7 +45,7 @@ public: void EnterCombat(Unit* /*who*/) OVERRIDE { - if (instance && instance->GetBossState(BOSS_BROODLORD) != DONE) + if (instance->GetBossState(BOSS_BROODLORD) != DONE) { EnterEvadeMode(); return; diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_flamegor.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_flamegor.cpp index e262cba1978..390bcaa3c9d 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_flamegor.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_flamegor.cpp @@ -50,7 +50,7 @@ public: void EnterCombat(Unit* /*who*/) OVERRIDE { - if (instance && instance->GetBossState(BOSS_BROODLORD) != DONE) + if (instance->GetBossState(BOSS_BROODLORD) != DONE) { EnterEvadeMode(); return; diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_nefarian.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_nefarian.cpp index 945d8b40d32..02662cd235c 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_nefarian.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_nefarian.cpp @@ -223,16 +223,14 @@ public: void SetData(uint32 type, uint32 data) OVERRIDE { - if (instance && type == 1 && data == 1) + if ( type == 1 && data == 1) { me->StopMoving(); events.ScheduleEvent(EVENT_PATH_2, 9000); } - if (instance && type == 1 && data == 2) - { + if (type == 1 && data == 2) events.ScheduleEvent(EVENT_SUCCESS_1, 5000); - } } void UpdateAI(uint32 diff) OVERRIDE diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_majordomo_executus.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_majordomo_executus.cpp index 294b662aea7..d2bd82447dc 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_majordomo_executus.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_majordomo_executus.cpp @@ -96,7 +96,7 @@ class boss_majordomo : public CreatureScript void UpdateAI(uint32 diff) OVERRIDE { - if (instance && instance->GetBossState(BOSS_MAJORDOMO_EXECUTUS) != DONE) + if (instance->GetBossState(BOSS_MAJORDOMO_EXECUTUS) != DONE) { if (!UpdateVictim()) return; diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_ragnaros.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_ragnaros.cpp index 4e135ad513a..4d22ba6abb3 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_ragnaros.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_ragnaros.cpp @@ -233,7 +233,7 @@ class boss_ragnaros : public CreatureScript break; case EVENT_SUBMERGE: { - if (instance && !_isBanished) + if (!_isBanished) { //Creature spawning and ragnaros becomming unattackable //is not very well supported in the core //no it really isnt diff --git a/src/server/scripts/EasternKingdoms/Gnomeregan/gnomeregan.cpp b/src/server/scripts/EasternKingdoms/Gnomeregan/gnomeregan.cpp index d26458be82e..38a72581d66 100644 --- a/src/server/scripts/EasternKingdoms/Gnomeregan/gnomeregan.cpp +++ b/src/server/scripts/EasternKingdoms/Gnomeregan/gnomeregan.cpp @@ -113,7 +113,7 @@ public: { InstanceScript* instance = creature->GetInstanceScript(); - if (instance && instance->GetData(TYPE_EVENT) == NOT_STARTED) + if (instance->GetData(TYPE_EVENT) == NOT_STARTED) player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_START_EVENT, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1); player->SEND_GOSSIP_MENU(GOSSIP_TEXT_EMI, creature->GetGUID()); @@ -193,15 +193,10 @@ public: instance->HandleGameObject(0, false, go); } - void SetInFace(bool bBool) + void SetInFace(bool isRight) { - if (bBool) - { - if (GameObject* go = GameObject::GetGameObject(*me, instance->GetData64(DATA_GO_CAVE_IN_RIGHT))) - me->SetFacingToObject(go); - }else - if (GameObject* go = GameObject::GetGameObject(*me, instance->GetData64(DATA_GO_CAVE_IN_LEFT))) - me->SetFacingToObject(go); + if (GameObject* go = GameObject::GetGameObject(*me, instance->GetData64(isRight ? DATA_GO_CAVE_IN_RIGHT : DATA_GO_CAVE_IN_LEFT))) + me->SetFacingToObject(go); } void RestoreAll() diff --git a/src/server/scripts/EasternKingdoms/Karazhan/boss_moroes.cpp b/src/server/scripts/EasternKingdoms/Karazhan/boss_moroes.cpp index 36bb2e32cb6..2dff776c35a 100644 --- a/src/server/scripts/EasternKingdoms/Karazhan/boss_moroes.cpp +++ b/src/server/scripts/EasternKingdoms/Karazhan/boss_moroes.cpp @@ -252,7 +252,7 @@ public: if (!UpdateVictim()) return; - if (instance && !instance->GetData(TYPE_MOROES)) + if (!instance->GetData(TYPE_MOROES)) { EnterEvadeMode(); return; @@ -371,7 +371,7 @@ struct boss_moroes_guestAI : public ScriptedAI void UpdateAI(uint32 /*diff*/) OVERRIDE { - if (instance && !instance->GetData(TYPE_MOROES)) + if (!instance->GetData(TYPE_MOROES)) EnterEvadeMode(); DoMeleeAttackIfReady(); diff --git a/src/server/scripts/EasternKingdoms/Karazhan/boss_netherspite.cpp b/src/server/scripts/EasternKingdoms/Karazhan/boss_netherspite.cpp index 1b9ef055b8c..ebd8762e9be 100644 --- a/src/server/scripts/EasternKingdoms/Karazhan/boss_netherspite.cpp +++ b/src/server/scripts/EasternKingdoms/Karazhan/boss_netherspite.cpp @@ -247,13 +247,13 @@ public: PortalPhase = false; Talk(EMOTE_PHASE_BANISH); - for (int i=0; i<3; ++i) + for (uint8 i = 0; i < 3; ++i) me->RemoveAurasDueToSpell(NetherBuff[i]); } void HandleDoors(bool open) // Massive Door switcher { - if (GameObject* Door = GameObject::GetGameObject(*me, instance ? instance->GetData64(DATA_GO_MASSIVE_DOOR) : 0)) + if (GameObject* Door = ObjectAccessor::GetGameObject(*me, instance->GetData64(DATA_GO_MASSIVE_DOOR) )) Door->SetGoState(open ? GO_STATE_ACTIVE : GO_STATE_READY); } diff --git a/src/server/scripts/EasternKingdoms/Karazhan/boss_prince_malchezaar.cpp b/src/server/scripts/EasternKingdoms/Karazhan/boss_prince_malchezaar.cpp index b82c0099ce4..bde326a5c37 100644 --- a/src/server/scripts/EasternKingdoms/Karazhan/boss_prince_malchezaar.cpp +++ b/src/server/scripts/EasternKingdoms/Karazhan/boss_prince_malchezaar.cpp @@ -297,12 +297,7 @@ public: void ClearWeapons() { SetEquipmentSlots(false, EQUIP_UNEQUIP, EQUIP_UNEQUIP, EQUIP_NO_CHANGE); - - //damage - const CreatureTemplate* cinfo = me->GetCreatureTemplate(); - me->SetBaseWeaponDamage(BASE_ATTACK, MINDAMAGE, cinfo->mindmg); - me->SetBaseWeaponDamage(BASE_ATTACK, MAXDAMAGE, cinfo->maxdmg); - me->UpdateDamagePhysical(BASE_ATTACK); + me->SetCanDualWield(false); } void EnfeebleHealthEffect() @@ -419,19 +414,8 @@ public: //models SetEquipmentSlots(false, EQUIP_ID_AXE, EQUIP_ID_AXE, EQUIP_NO_CHANGE); - //damage - const CreatureTemplate* cinfo = me->GetCreatureTemplate(); - me->SetBaseWeaponDamage(BASE_ATTACK, MINDAMAGE, 2*cinfo->mindmg); - me->SetBaseWeaponDamage(BASE_ATTACK, MAXDAMAGE, 2*cinfo->maxdmg); - me->UpdateDamagePhysical(BASE_ATTACK); - - me->SetBaseWeaponDamage(OFF_ATTACK, MINDAMAGE, cinfo->mindmg); - me->SetBaseWeaponDamage(OFF_ATTACK, MAXDAMAGE, cinfo->maxdmg); - //Sigh, updating only works on main attack, do it manually .... - me->SetFloatValue(UNIT_FIELD_MINOFFHANDDAMAGE, cinfo->mindmg); - me->SetFloatValue(UNIT_FIELD_MAXOFFHANDDAMAGE, cinfo->maxdmg); - me->SetAttackTime(OFF_ATTACK, (me->GetAttackTime(BASE_ATTACK)*150)/100); + me->SetCanDualWield(true); } } else if (phase == 2) diff --git a/src/server/scripts/EasternKingdoms/Karazhan/karazhan.cpp b/src/server/scripts/EasternKingdoms/Karazhan/karazhan.cpp index f667394f29c..241ac85faa2 100644 --- a/src/server/scripts/EasternKingdoms/Karazhan/karazhan.cpp +++ b/src/server/scripts/EasternKingdoms/Karazhan/karazhan.cpp @@ -496,12 +496,13 @@ public: EventStarted = false; YellTimer = 0; - if (instance && instance->GetData64(DATA_IMAGE_OF_MEDIVH) == 0) + if (instance->GetData64(DATA_IMAGE_OF_MEDIVH) == 0) { instance->SetData64(DATA_IMAGE_OF_MEDIVH, me->GetGUID()); (*me).GetMotionMaster()->MovePoint(1, MedivPos[0], MedivPos[1], MedivPos[2]); Step = 0; - }else + } + else { me->DealDamage(me, me->GetHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false); me->RemoveCorpse(); diff --git a/src/server/scripts/EasternKingdoms/MagistersTerrace/boss_felblood_kaelthas.cpp b/src/server/scripts/EasternKingdoms/MagistersTerrace/boss_felblood_kaelthas.cpp index 6c15fdc77fa..0601c69e96d 100644 --- a/src/server/scripts/EasternKingdoms/MagistersTerrace/boss_felblood_kaelthas.cpp +++ b/src/server/scripts/EasternKingdoms/MagistersTerrace/boss_felblood_kaelthas.cpp @@ -515,7 +515,7 @@ public: return; } //Don't really die in all phases of Kael'Thas - if (instance && instance->GetData(DATA_KAELTHAS_EVENT) == 0) + if (instance->GetData(DATA_KAELTHAS_EVENT) == 0) { //prevent death damage = 0; diff --git a/src/server/scripts/EasternKingdoms/MagistersTerrace/boss_priestess_delrissa.cpp b/src/server/scripts/EasternKingdoms/MagistersTerrace/boss_priestess_delrissa.cpp index 8592120f94a..4bc0ee68cc3 100644 --- a/src/server/scripts/EasternKingdoms/MagistersTerrace/boss_priestess_delrissa.cpp +++ b/src/server/scripts/EasternKingdoms/MagistersTerrace/boss_priestess_delrissa.cpp @@ -376,7 +376,7 @@ struct boss_priestess_lackey_commonAI : public ScriptedAI ResetThreatTimer = urand(5000, 20000); // in case she is not alive and Reset was for some reason called, respawn her (most likely party wipe after killing her) - if (Creature* pDelrissa = Unit::GetCreature(*me, instance ? instance->GetData64(DATA_DELRISSA) : 0)) + if (Creature* pDelrissa = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_DELRISSA))) { if (!pDelrissa->IsAlive()) pDelrissa->Respawn(); diff --git a/src/server/scripts/EasternKingdoms/ScarletMonastery/boss_mograine_and_whitemane.cpp b/src/server/scripts/EasternKingdoms/ScarletMonastery/boss_mograine_and_whitemane.cpp index 0d62d47a5d6..a78dce47784 100644 --- a/src/server/scripts/EasternKingdoms/ScarletMonastery/boss_mograine_and_whitemane.cpp +++ b/src/server/scripts/EasternKingdoms/ScarletMonastery/boss_mograine_and_whitemane.cpp @@ -172,7 +172,7 @@ public: if (!UpdateVictim()) return; - if (_bHasDied && !_bHeal && instance && instance->GetData(TYPE_MOGRAINE_AND_WHITE_EVENT) == SPECIAL) + if (_bHasDied && !_bHeal && instance->GetData(TYPE_MOGRAINE_AND_WHITE_EVENT) == SPECIAL) { //On ressurection, stop fake death and heal whitemane and resume fight if (Unit* Whitemane = Unit::GetUnit(*me, instance->GetData64(DATA_WHITEMANE))) @@ -259,7 +259,7 @@ public: void AttackStart(Unit* who) OVERRIDE { - if (instance && instance->GetData(TYPE_MOGRAINE_AND_WHITE_EVENT) == NOT_STARTED) + if (instance->GetData(TYPE_MOGRAINE_AND_WHITE_EVENT) == NOT_STARTED) return; ScriptedAI::AttackStart(who); @@ -289,11 +289,11 @@ public: if (_bCanResurrect) { //When casting resuruction make sure to delay so on rez when reinstate battle deepsleep runs out - if (instance && Wait_Timer <= diff) + if (Wait_Timer <= diff) { - if (Unit* Mograine = Unit::GetUnit(*me, instance->GetData64(DATA_MOGRAINE))) + if (Creature* mograine = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_MOGRAINE))) { - DoCast(Mograine, SPELL_SCARLETRESURRECTION); + DoCast(mograine, SPELL_SCARLETRESURRECTION); Talk(SAY_WH_RESSURECT); _bCanResurrect = false; } @@ -325,7 +325,7 @@ public: if (!HealthAbovePct(75)) target = me; - if (Creature* mograine = Unit::GetCreature((*me), instance->GetData64(DATA_MOGRAINE))) + if (Creature* mograine = Unit::GetCreature(*me, instance->GetData64(DATA_MOGRAINE))) { // checking _bCanResurrectCheck prevents her healing Mograine while he is "faking death" if (_bCanResurrectCheck && mograine->IsAlive() && !mograine->HealthAbovePct(75)) diff --git a/src/server/scripts/EasternKingdoms/ShadowfangKeep/shadowfang_keep.cpp b/src/server/scripts/EasternKingdoms/ShadowfangKeep/shadowfang_keep.cpp index eb7295f72d0..dff637fd764 100644 --- a/src/server/scripts/EasternKingdoms/ShadowfangKeep/shadowfang_keep.cpp +++ b/src/server/scripts/EasternKingdoms/ShadowfangKeep/shadowfang_keep.cpp @@ -92,7 +92,7 @@ public: { InstanceScript* instance = creature->GetInstanceScript(); - if (instance && instance->GetData(TYPE_FREE_NPC) != DONE && instance->GetData(TYPE_RETHILGORE) == DONE) + if (instance->GetData(TYPE_FREE_NPC) != DONE && instance->GetData(TYPE_RETHILGORE) == DONE) player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_ITEM_DOOR, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1); player->SEND_GOSSIP_MENU(player->GetGossipTextId(creature), creature->GetGUID()); diff --git a/src/server/scripts/EasternKingdoms/Stratholme/boss_baron_rivendare.cpp b/src/server/scripts/EasternKingdoms/Stratholme/boss_baron_rivendare.cpp index fe0e3a050c8..f4663c0f8ec 100644 --- a/src/server/scripts/EasternKingdoms/Stratholme/boss_baron_rivendare.cpp +++ b/src/server/scripts/EasternKingdoms/Stratholme/boss_baron_rivendare.cpp @@ -93,7 +93,7 @@ public: MortalStrike_Timer = 12000; // RaiseDead_Timer = 30000; SummonSkeletons_Timer = 34000; - if (instance && instance->GetData(TYPE_RAMSTEIN) == DONE) + if (instance->GetData(TYPE_RAMSTEIN) == DONE) instance->SetData(TYPE_BARON, NOT_STARTED); } diff --git a/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_brutallus.cpp b/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_brutallus.cpp index a52ddcea3b0..9dcbed211bb 100644 --- a/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_brutallus.cpp +++ b/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_brutallus.cpp @@ -176,7 +176,7 @@ public: void DoIntro() { - Creature* Madrigosa = ObjectAccessor::GetCreature(*me, instance ? instance->GetData64(DATA_MADRIGOSA) : 0); + Creature* Madrigosa = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_MADRIGOSA)); if (!Madrigosa) return; diff --git a/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_kiljaeden.cpp b/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_kiljaeden.cpp index 9d073cd7ef8..e8b112aa1cd 100644 --- a/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_kiljaeden.cpp +++ b/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_kiljaeden.cpp @@ -454,7 +454,7 @@ public: { if (uiRandomSayTimer < diff) { - if (instance && instance->GetBossState(DATA_MURU) != DONE && instance->GetBossState(DATA_KILJAEDEN) == NOT_STARTED) + if (instance->GetBossState(DATA_MURU) != DONE && instance->GetBossState(DATA_KILJAEDEN) == NOT_STARTED) Talk(SAY_KJ_OFFCOMBAT); uiRandomSayTimer = 30000; } else uiRandomSayTimer -= diff; @@ -1206,7 +1206,7 @@ public: if (uiTimer <= diff) { - if (Unit* random = Unit::GetUnit(*me, instance ? instance->GetData64(DATA_PLAYER_GUID) : 0)) + if (Unit* random = ObjectAccessor::GetPlayer(*me, instance->GetData64(DATA_PLAYER_GUID))) DoCast(random, SPELL_SHADOW_BOLT, false); uiTimer = urand(500, 1000); } else uiTimer -= diff; diff --git a/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_muru.cpp b/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_muru.cpp index 426771e6db6..6980dbfb9c2 100644 --- a/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_muru.cpp +++ b/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_muru.cpp @@ -433,10 +433,11 @@ public: { if (!SummonSentinel) { - if (InAction && instance && instance->GetBossState(DATA_MURU) == NOT_STARTED) + if (InAction && instance->GetBossState(DATA_MURU) == NOT_STARTED) Reset(); return; } + if (SummonTimer <= diff) { DoCastAOE(SPELL_SUMMON_VOID_SENTINEL, false); @@ -602,7 +603,7 @@ public: { if (SpellTimer <= diff) { - Unit* Victim = Unit::GetUnit(*me, instance ? instance->GetData64(DATA_PLAYER_GUID) : 0); + Unit* Victim = Unit::GetUnit(*me, instance->GetData64(DATA_PLAYER_GUID)); switch (NeedForAHack) { case 0: diff --git a/src/server/scripts/EasternKingdoms/ZulAman/boss_akilzon.cpp b/src/server/scripts/EasternKingdoms/ZulAman/boss_akilzon.cpp index 646c9ddfe81..eca840dbeb2 100644 --- a/src/server/scripts/EasternKingdoms/ZulAman/boss_akilzon.cpp +++ b/src/server/scripts/EasternKingdoms/ZulAman/boss_akilzon.cpp @@ -228,7 +228,7 @@ class boss_akilzon : public CreatureScript case EVENT_STATIC_DISRUPTION: { Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1); - if (!target) + if (!target) target = me->GetVictim(); if (target) { @@ -244,7 +244,7 @@ class boss_akilzon : public CreatureScript case EVENT_GUST_OF_WIND: { Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1); - if (!target) + if (!target) target = me->GetVictim(); if (target) DoCast(target, SPELL_GUST_OF_WIND); diff --git a/src/server/scripts/EasternKingdoms/ZulAman/boss_hexlord.cpp b/src/server/scripts/EasternKingdoms/ZulAman/boss_hexlord.cpp index 04e3d9f3450..d6657ac0986 100644 --- a/src/server/scripts/EasternKingdoms/ZulAman/boss_hexlord.cpp +++ b/src/server/scripts/EasternKingdoms/ZulAman/boss_hexlord.cpp @@ -231,7 +231,7 @@ struct boss_hexlord_addAI : public ScriptedAI void UpdateAI(uint32 /*diff*/) OVERRIDE { - if (instance && instance->GetData(DATA_HEXLORDEVENT) != IN_PROGRESS) + if (instance->GetData(DATA_HEXLORDEVENT) != IN_PROGRESS) { EnterEvadeMode(); return; diff --git a/src/server/scripts/EasternKingdoms/ZulGurub/boss_arlokk.cpp b/src/server/scripts/EasternKingdoms/ZulGurub/boss_arlokk.cpp index 4bf50581108..e542b3c4895 100644 --- a/src/server/scripts/EasternKingdoms/ZulGurub/boss_arlokk.cpp +++ b/src/server/scripts/EasternKingdoms/ZulGurub/boss_arlokk.cpp @@ -96,24 +96,21 @@ class boss_arlokk : public CreatureScript void Reset() OVERRIDE { + if (events.IsInPhase(PHASE_TWO)) + me->HandleStatModifier(UNIT_MOD_DAMAGE_MAINHAND, TOTAL_PCT, 35.0f, false); // hack + _Reset(); _summonCountA = 0; _summonCountB = 0; - me->RemoveAllAuras(); me->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID + 0, uint32(WEAPON_DAGGER)); me->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID + 1, uint32(WEAPON_DAGGER)); - if (GameObject* gate = me->GetMap()->GetGameObject(instance->GetData64(GO_FORCEFIELD))) - gate->SetGoState(GO_STATE_READY); me->SetWalk(false); me->GetMotionMaster()->MovePoint(0, PosMoveOnSpawn[0]); } void JustDied(Unit* /*killer*/) OVERRIDE { + _JustDied(); Talk(SAY_DEATH); - me->RemoveAllAuras(); - if (GameObject* gate = me->GetMap()->GetGameObject(instance->GetData64(GO_FORCEFIELD))) - gate->SetGoState(GO_STATE_ACTIVE); - instance->SetBossState(DATA_ARLOKK, DONE); } void EnterCombat(Unit* /*who*/) OVERRIDE @@ -154,11 +151,9 @@ class boss_arlokk : public CreatureScript void EnterEvadeMode() OVERRIDE { - if (GameObject* object = me->GetMap()->GetGameObject(instance->GetData64(GO_FORCEFIELD))) - object->SetGoState(GO_STATE_ACTIVE); - if (GameObject* object = me->GetMap()->GetGameObject(instance->GetData64(GO_GONG_OF_BETHEKK))) + BossAI::EnterEvadeMode(); + if (GameObject* object = ObjectAccessor::GetGameObject(*me, instance->GetData64(GO_GONG_OF_BETHEKK))) object->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE); - instance->SetBossState(DATA_ARLOKK, NOT_STARTED); me->DespawnOrUnsummon(4000); } @@ -194,7 +189,7 @@ class boss_arlokk : public CreatureScript case EVENT_SUMMON_PROWLERS: if (_summonCountA < MAX_PROWLERS_PER_SIDE) { - if (Unit* trigger = me->GetUnit(*me, _triggersSideAGUID[urand(0, 4)])) + if (Unit* trigger = ObjectAccessor::GetUnit(*me, _triggersSideAGUID[urand(0, 4)])) { trigger->CastSpell(trigger, SPELL_SUMMON_PROWLER); ++_summonCountA; @@ -202,7 +197,7 @@ class boss_arlokk : public CreatureScript } if (_summonCountB < MAX_PROWLERS_PER_SIDE) { - if (Unit* trigger = me->GetUnit(*me, _triggersSideBGUID[urand(0, 4)])) + if (Unit* trigger = ObjectAccessor::GetUnit(*me, _triggersSideBGUID[urand(0, 4)])) { trigger->CastSpell(trigger, SPELL_SUMMON_PROWLER); ++_summonCountB; @@ -225,13 +220,15 @@ class boss_arlokk : public CreatureScript } case EVENT_TRANSFORM: { - DoCast(me, SPELL_PANTHER_TRANSFORM); + DoCast(me, SPELL_PANTHER_TRANSFORM); // SPELL_AURA_TRANSFORM me->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID + 0, uint32(EQUIP_UNEQUIP)); me->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID + 1, uint32(EQUIP_UNEQUIP)); + /* const CreatureTemplate* cinfo = me->GetCreatureTemplate(); me->SetBaseWeaponDamage(BASE_ATTACK, MINDAMAGE, (cinfo->mindmg +((cinfo->mindmg/100) * 35))); me->SetBaseWeaponDamage(BASE_ATTACK, MAXDAMAGE, (cinfo->maxdmg +((cinfo->maxdmg/100) * 35))); me->UpdateDamagePhysical(BASE_ATTACK); + */ me->AttackStop(); DoResetThreat(); me->SetReactState(REACT_PASSIVE); @@ -262,6 +259,7 @@ class boss_arlokk : public CreatureScript events.ScheduleEvent(EVENT_RAVAGE, urand(10000, 14000), 0, PHASE_TWO); events.ScheduleEvent(EVENT_TRANSFORM_BACK, urand(15000, 18000), 0, PHASE_TWO); events.SetPhase(PHASE_TWO); + me->HandleStatModifier(UNIT_MOD_DAMAGE_MAINHAND, TOTAL_PCT, 35.0f, true); // hack break; case EVENT_RAVAGE: DoCastVictim(SPELL_RAVAGE, true); @@ -269,14 +267,17 @@ class boss_arlokk : public CreatureScript break; case EVENT_TRANSFORM_BACK: { - me->RemoveAura(SPELL_PANTHER_TRANSFORM); + me->RemoveAura(SPELL_PANTHER_TRANSFORM); // SPELL_AURA_TRANSFORM DoCast(me, SPELL_VANISH_VISUAL); me->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID + 0, uint32(WEAPON_DAGGER)); me->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID + 1, uint32(WEAPON_DAGGER)); + /* const CreatureTemplate* cinfo = me->GetCreatureTemplate(); me->SetBaseWeaponDamage(BASE_ATTACK, MINDAMAGE, (cinfo->mindmg)); me->SetBaseWeaponDamage(BASE_ATTACK, MAXDAMAGE, (cinfo->maxdmg)); me->UpdateDamagePhysical(BASE_ATTACK); + */ + me->HandleStatModifier(UNIT_MOD_DAMAGE_MAINHAND, TOTAL_PCT, 35.0f, false); // hack events.ScheduleEvent(EVENT_SHADOW_WORD_PAIN, urand(4000, 7000), 0, PHASE_ONE); events.ScheduleEvent(EVENT_GOUGE, urand(12000, 15000), 0, PHASE_ONE); events.ScheduleEvent(EVENT_TRANSFORM, urand(16000, 20000), 0, PHASE_ONE); @@ -343,9 +344,8 @@ class npc_zulian_prowler : public CreatureScript DoCast(me, SPELL_SNEAK_RANK_1_1); DoCast(me, SPELL_SNEAK_RANK_1_2); - if (_instance) - if (Unit* arlokk = me->GetUnit(*me, _instance->GetData64(NPC_ARLOKK))) - me->GetMotionMaster()->MovePoint(0, arlokk->GetPositionX(), arlokk->GetPositionY(), arlokk->GetPositionZ()); + if (Unit* arlokk = me->GetUnit(*me, _instance->GetData64(NPC_ARLOKK))) + me->GetMotionMaster()->MovePoint(0, arlokk->GetPositionX(), arlokk->GetPositionY(), arlokk->GetPositionZ()); _events.ScheduleEvent(EVENT_ATTACK, 6000); } @@ -364,13 +364,10 @@ class npc_zulian_prowler : public CreatureScript void JustDied(Unit* /*killer*/) OVERRIDE { - if (_instance) + if (Unit* arlokk = me->GetUnit(*me, _instance->GetData64(NPC_ARLOKK))) { - if (Unit* arlokk = me->GetUnit(*me, _instance->GetData64(NPC_ARLOKK))) - { - if (arlokk->IsAlive()) - arlokk->GetAI()->SetData(_sideData, 0); - } + if (arlokk->IsAlive()) + arlokk->GetAI()->SetData(_sideData, 0); } me->DespawnOrUnsummon(4000); } diff --git a/src/server/scripts/EasternKingdoms/ZulGurub/boss_jeklik.cpp b/src/server/scripts/EasternKingdoms/ZulGurub/boss_jeklik.cpp index e6ef90d1638..ad2d247c1e7 100644 --- a/src/server/scripts/EasternKingdoms/ZulGurub/boss_jeklik.cpp +++ b/src/server/scripts/EasternKingdoms/ZulGurub/boss_jeklik.cpp @@ -1,6 +1,5 @@ /* * Copyright (C) 2008-2014 TrinityCore <http://www.trinitycore.org/> - * Copyright (C) 2006-2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/> * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the @@ -16,13 +15,6 @@ * with this program. If not, see <http://www.gnu.org/licenses/>. */ -/* ScriptData -SDName: Boss_Jeklik -SD%Complete: 85 -SDComment: Problem in finding the right flying batriders for spawning and making them fly. -SDCategory: Zul'Gurub -EndScriptData */ - #include "ScriptMgr.h" #include "ScriptedCreature.h" #include "zulgurub.h" @@ -44,11 +36,47 @@ enum Spells SPELL_CHAIN_MIND_FLAY = 26044, // Right ID unknown. So disabled SPELL_GREATERHEAL = 23954, SPELL_BAT_FORM = 23966, + // Batriders Spell SPELL_BOMB = 40332 // Wrong ID but Magmadars bomb is not working... }; -class boss_jeklik : public CreatureScript //jeklik +enum BatIds +{ + NPC_BLOODSEEKER_BAT = 11368, + NPC_FRENZIED_BAT = 14965 +}; + +enum Events +{ + EVENT_CHARGE_JEKLIK = 1, + EVENT_SONIC_BURST, + EVENT_SCREECH, + EVENT_SPAWN_BATS, + EVENT_SHADOW_WORD_PAIN, + EVENT_MIND_FLAY, + EVENT_CHAIN_MIND_FLAY, + EVENT_GREATER_HEAL, + EVENT_SPAWN_FLYING_BATS +}; + +enum Phase +{ + PHASE_ONE = 1, + PHASE_TWO = 2 +}; + +Position const SpawnBat[6] = +{ + { -12291.6220f, -1380.2640f, 144.8304f, 5.483f }, + { -12289.6220f, -1380.2640f, 144.8304f, 5.483f }, + { -12293.6220f, -1380.2640f, 144.8304f, 5.483f }, + { -12291.6220f, -1380.2640f, 144.8304f, 5.483f }, + { -12289.6220f, -1380.2640f, 144.8304f, 5.483f }, + { -12293.6220f, -1380.2640f, 144.8304f, 5.483f } +}; + +class boss_jeklik : public CreatureScript { public: boss_jeklik() : CreatureScript("boss_jeklik") { } @@ -56,32 +84,9 @@ class boss_jeklik : public CreatureScript //jeklik { boss_jeklikAI(Creature* creature) : BossAI(creature, DATA_JEKLIK) { } - uint32 Charge_Timer; - uint32 SonicBurst_Timer; - uint32 Screech_Timer; - uint32 SpawnBats_Timer; - uint32 ShadowWordPain_Timer; - uint32 MindFlay_Timer; - uint32 ChainMindFlay_Timer; - uint32 GreaterHeal_Timer; - uint32 SpawnFlyingBats_Timer; - - bool PhaseTwo; - void Reset() OVERRIDE { _Reset(); - Charge_Timer = 20000; - SonicBurst_Timer = 8000; - Screech_Timer = 13000; - SpawnBats_Timer = 60000; - ShadowWordPain_Timer = 6000; - MindFlay_Timer = 11000; - ChainMindFlay_Timer = 26000; - GreaterHeal_Timer = 50000; - SpawnFlyingBats_Timer = 10000; - - PhaseTwo = false; } void JustDied(Unit* /*killer*/) OVERRIDE @@ -94,156 +99,124 @@ class boss_jeklik : public CreatureScript //jeklik { _EnterCombat(); Talk(SAY_AGGRO); + events.SetPhase(PHASE_ONE); + + events.ScheduleEvent(EVENT_CHARGE_JEKLIK, 20000, 0, PHASE_ONE); + events.ScheduleEvent(EVENT_SONIC_BURST, 8000, 0, PHASE_ONE); + events.ScheduleEvent(EVENT_SCREECH, 13000, 0, PHASE_ONE); + events.ScheduleEvent(EVENT_SPAWN_BATS, 60000, 0, PHASE_ONE); + + me->SetCanFly(true); DoCast(me, SPELL_BAT_FORM); } + void DamageTaken(Unit* /*attacker*/, uint32& /*damage*/) OVERRIDE + { + if (events.IsInPhase(PHASE_ONE) && !HealthAbovePct(50)) + { + me->RemoveAurasDueToSpell(SPELL_BAT_FORM); + me->SetCanFly(false); + DoResetThreat(); + events.SetPhase(PHASE_TWO); + events.ScheduleEvent(EVENT_SHADOW_WORD_PAIN, 6000, 0, PHASE_TWO); + events.ScheduleEvent(EVENT_MIND_FLAY, 11000, 0, PHASE_TWO); + events.ScheduleEvent(EVENT_CHAIN_MIND_FLAY, 26000, 0, PHASE_TWO); + events.ScheduleEvent(EVENT_GREATER_HEAL, 50000, 0, PHASE_TWO); + events.ScheduleEvent(EVENT_SPAWN_FLYING_BATS, 10000, 0, PHASE_TWO); + return; + } + } + void UpdateAI(uint32 diff) OVERRIDE { if (!UpdateVictim()) return; - if (me->GetVictim() && me->IsAlive()) + events.Update(diff); + + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + + while (uint32 eventId = events.ExecuteEvent()) { - if (HealthAbovePct(50)) + switch (eventId) { - if (Charge_Timer <= diff) - { + case EVENT_CHARGE_JEKLIK: if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0)) { DoCast(target, SPELL_CHARGE); AttackStart(target); } - - Charge_Timer = urand(15000, 30000); - } else Charge_Timer -= diff; - - if (SonicBurst_Timer <= diff) - { + events.ScheduleEvent(EVENT_CHARGE_JEKLIK, urand(15000, 30000), 0, PHASE_ONE); + break; + case EVENT_SONIC_BURST: DoCastVictim(SPELL_SONICBURST); - SonicBurst_Timer = urand(8000, 13000); - } else SonicBurst_Timer -= diff; - - if (Screech_Timer <= diff) - { + events.ScheduleEvent(EVENT_SONIC_BURST, urand(8000, 13000), 0, PHASE_ONE); + case EVENT_SCREECH: DoCastVictim(SPELL_SCREECH); - Screech_Timer = urand(18000, 26000); - } else Screech_Timer -= diff; - - if (SpawnBats_Timer <= diff) - { - Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0); - - Creature* Bat = NULL; - Bat = me->SummonCreature(11368, -12291.6220f, -1380.2640f, 144.8304f, 5.483f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000); - if (target && Bat) Bat ->AI()->AttackStart(target); - - Bat = me->SummonCreature(11368, -12289.6220f, -1380.2640f, 144.8304f, 5.483f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000); - if (target && Bat) Bat ->AI()->AttackStart(target); - - Bat = me->SummonCreature(11368, -12293.6220f, -1380.2640f, 144.8304f, 5.483f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000); - if (target && Bat) Bat ->AI()->AttackStart(target); - - Bat = me->SummonCreature(11368, -12291.6220f, -1380.2640f, 144.8304f, 5.483f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000); - if (target && Bat) Bat ->AI()->AttackStart(target); - - Bat = me->SummonCreature(11368, -12289.6220f, -1380.2640f, 144.8304f, 5.483f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000); - if (target && Bat) Bat ->AI()->AttackStart(target); - Bat = me->SummonCreature(11368, -12293.6220f, -1380.2640f, 144.8304f, 5.483f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000); - if (target && Bat) Bat ->AI()->AttackStart(target); - - SpawnBats_Timer = 60000; - } else SpawnBats_Timer -= diff; - } - else - { - if (PhaseTwo) - { - if (ShadowWordPain_Timer <= diff) - { - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0)) - { - DoCast(target, SPELL_SHADOW_WORD_PAIN); - ShadowWordPain_Timer = urand(12000, 18000); - } - }ShadowWordPain_Timer -=diff; - - if (MindFlay_Timer <= diff) - { - DoCastVictim(SPELL_MIND_FLAY); - MindFlay_Timer = 16000; - }MindFlay_Timer -=diff; - - if (ChainMindFlay_Timer <= diff) - { - me->InterruptNonMeleeSpells(false); - DoCastVictim(SPELL_CHAIN_MIND_FLAY); - ChainMindFlay_Timer = urand(15000, 30000); - }ChainMindFlay_Timer -=diff; - - if (GreaterHeal_Timer <= diff) - { - me->InterruptNonMeleeSpells(false); - DoCast(me, SPELL_GREATERHEAL); - GreaterHeal_Timer = urand(25000, 35000); - }GreaterHeal_Timer -=diff; - - if (SpawnFlyingBats_Timer <= diff) - { - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0)) - { - if (Creature* FlyingBat = me->SummonCreature(14965, target->GetPositionX(), target->GetPositionY(), target->GetPositionZ()+15, 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000)) - FlyingBat->AI()->AttackStart(target); - } - - SpawnFlyingBats_Timer = urand(10000, 15000); - } else SpawnFlyingBats_Timer -=diff; - } - else - { - me->SetDisplayId(15219); - DoResetThreat(); - PhaseTwo = true; - } + events.ScheduleEvent(EVENT_SCREECH, urand(18000, 26000), 0, PHASE_ONE); + case EVENT_SPAWN_BATS: + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0)) + for (uint8 i = 0; i < 6; ++i) + if (Creature* bat = me->SummonCreature(NPC_BLOODSEEKER_BAT, SpawnBat[i], TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000)) + bat->AI()->AttackStart(target); + events.ScheduleEvent(EVENT_SPAWN_BATS, 60000, 0, PHASE_ONE); + break; + case EVENT_SHADOW_WORD_PAIN: + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0)) + DoCast(target, SPELL_SHADOW_WORD_PAIN); + events.ScheduleEvent(EVENT_SHADOW_WORD_PAIN, urand(12000, 18000), 0, PHASE_TWO); + break; + case EVENT_MIND_FLAY: + DoCastVictim(SPELL_MIND_FLAY); + events.ScheduleEvent(EVENT_MIND_FLAY, 16000, 0, PHASE_TWO); + break; + case EVENT_CHAIN_MIND_FLAY: + me->InterruptNonMeleeSpells(false); + DoCastVictim(SPELL_CHAIN_MIND_FLAY); + events.ScheduleEvent(EVENT_CHAIN_MIND_FLAY, urand(15000, 30000), 0, PHASE_TWO); + break; + case EVENT_GREATER_HEAL: + me->InterruptNonMeleeSpells(false); + DoCast(me, SPELL_GREATERHEAL); + events.ScheduleEvent(EVENT_GREATER_HEAL, urand(25000, 35000), 0, PHASE_TWO); + break; + case EVENT_SPAWN_FLYING_BATS: + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0)) + if (Creature* flyingBat = me->SummonCreature(NPC_FRENZIED_BAT, target->GetPositionX(), target->GetPositionY(), target->GetPositionZ() + 15.0f, 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000)) + flyingBat->AI()->AttackStart(target); + events.ScheduleEvent(EVENT_SPAWN_FLYING_BATS, urand(10000, 15000), 0, PHASE_TWO); + break; + default: + break; } - - DoMeleeAttackIfReady(); } + + DoMeleeAttackIfReady(); } }; CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new boss_jeklikAI(creature); + return GetZulGurubAI<boss_jeklikAI>(creature); } }; -//Flying Bat +// Flying Bat class npc_batrider : public CreatureScript { public: - - npc_batrider() - : CreatureScript("npc_batrider") - { - } + npc_batrider() : CreatureScript("npc_batrider") { } struct npc_batriderAI : public ScriptedAI { - npc_batriderAI(Creature* creature) : ScriptedAI(creature) - { - instance = creature->GetInstanceScript(); - } - - InstanceScript* instance; + npc_batriderAI(Creature* creature) : ScriptedAI(creature) { } uint32 Bomb_Timer; - uint32 Check_Timer; void Reset() OVERRIDE { Bomb_Timer = 2000; - Check_Timer = 1000; - me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); } @@ -254,7 +227,6 @@ class npc_batrider : public CreatureScript if (!UpdateVictim()) return; - //Bomb_Timer if (Bomb_Timer <= diff) { if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0)) @@ -262,20 +234,9 @@ class npc_batrider : public CreatureScript DoCast(target, SPELL_BOMB); Bomb_Timer = 5000; } - } else Bomb_Timer -= diff; - - //Check_Timer - if (Check_Timer <= diff) - { - if (instance->GetBossState(DATA_JEKLIK) == DONE) - { - me->setDeathState(JUST_DIED); - me->RemoveCorpse(); - return; - } - - Check_Timer = 1000; - } else Check_Timer -= diff; + } + else + Bomb_Timer -= diff; DoMeleeAttackIfReady(); } @@ -283,7 +244,7 @@ class npc_batrider : public CreatureScript CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return GetInstanceAI<npc_batriderAI>(creature); + return new npc_batriderAI(creature); } }; @@ -292,4 +253,3 @@ void AddSC_boss_jeklik() new boss_jeklik(); new npc_batrider(); } - diff --git a/src/server/scripts/EasternKingdoms/ZulGurub/boss_marli.cpp b/src/server/scripts/EasternKingdoms/ZulGurub/boss_marli.cpp index 3ff18d81032..efd79d89a2b 100644 --- a/src/server/scripts/EasternKingdoms/ZulGurub/boss_marli.cpp +++ b/src/server/scripts/EasternKingdoms/ZulGurub/boss_marli.cpp @@ -64,11 +64,6 @@ enum Phases PHASE_THREE = 3 }; -enum ModelId -{ - MODEL_MARLI = 15220 -}; - class boss_marli : public CreatureScript { public: boss_marli() : CreatureScript("boss_marli") { } @@ -79,6 +74,8 @@ class boss_marli : public CreatureScript void Reset() OVERRIDE { + if (events.IsInPhase(PHASE_THREE)) + me->HandleStatModifier(UNIT_MOD_DAMAGE_MAINHAND, TOTAL_PCT, 35.0f, false); // hack _Reset(); } @@ -155,11 +152,14 @@ class boss_marli : public CreatureScript case EVENT_TRANSFORM: { Talk(SAY_TRANSFORM); - DoCast(me, SPELL_SPIDER_FORM); + DoCast(me, SPELL_SPIDER_FORM); // SPELL_AURA_TRANSFORM + /* CreatureTemplate const* cinfo = me->GetCreatureTemplate(); me->SetBaseWeaponDamage(BASE_ATTACK, MINDAMAGE, (cinfo->mindmg +((cinfo->mindmg/100) * 35))); me->SetBaseWeaponDamage(BASE_ATTACK, MAXDAMAGE, (cinfo->maxdmg +((cinfo->maxdmg/100) * 35))); me->UpdateDamagePhysical(BASE_ATTACK); + */ + me->HandleStatModifier(UNIT_MOD_DAMAGE_MAINHAND, TOTAL_PCT, 35.0f, true); // hack DoCastVictim(SPELL_ENVOLWINGWEB); if (DoGetThreat(me->GetVictim())) DoModifyThreatPercent(me->GetVictim(), -100); @@ -188,11 +188,14 @@ class boss_marli : public CreatureScript } case EVENT_TRANSFORM_BACK: { - me->SetDisplayId(MODEL_MARLI); + me->RemoveAura(SPELL_SPIDER_FORM); + /* CreatureTemplate const* cinfo = me->GetCreatureTemplate(); me->SetBaseWeaponDamage(BASE_ATTACK, MINDAMAGE, (cinfo->mindmg +((cinfo->mindmg/100) * 1))); me->SetBaseWeaponDamage(BASE_ATTACK, MAXDAMAGE, (cinfo->maxdmg +((cinfo->maxdmg/100) * 1))); me->UpdateDamagePhysical(BASE_ATTACK); + */ + me->HandleStatModifier(UNIT_MOD_DAMAGE_MAINHAND, TOTAL_PCT, 35.0f, false); // hack events.ScheduleEvent(EVENT_ASPECT_OF_MARLI, 12000, 0, PHASE_TWO); events.ScheduleEvent(EVENT_TRANSFORM, 45000, 0, PHASE_TWO); events.ScheduleEvent(EVENT_POISON_VOLLEY, 15000); diff --git a/src/server/scripts/EasternKingdoms/ZulGurub/boss_thekal.cpp b/src/server/scripts/EasternKingdoms/ZulGurub/boss_thekal.cpp index d857bff69e0..a70dd5e0a30 100644 --- a/src/server/scripts/EasternKingdoms/ZulGurub/boss_thekal.cpp +++ b/src/server/scripts/EasternKingdoms/ZulGurub/boss_thekal.cpp @@ -89,6 +89,8 @@ class boss_thekal : public CreatureScript void Reset() OVERRIDE { + if (events.IsInPhase(PHASE_TWO)) + me->HandleStatModifier(UNIT_MOD_DAMAGE_MAINHAND, TOTAL_PCT, 35.0f, false); // hack _Reset(); Enraged = false; WasDead = false; @@ -141,15 +143,17 @@ class boss_thekal : public CreatureScript //Thekal will transform to Tiger if he died and was not resurrected after 10 seconds. if (WasDead) { - DoCast(me, SPELL_TIGER_FORM); + DoCast(me, SPELL_TIGER_FORM); // SPELL_AURA_TRANSFORM me->SetObjectScale(2.00f); me->SetStandState(UNIT_STAND_STATE_STAND); me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); - me->SetFullHealth(); + /* const CreatureTemplate* cinfo = me->GetCreatureTemplate(); me->SetBaseWeaponDamage(BASE_ATTACK, MINDAMAGE, (cinfo->mindmg +((cinfo->mindmg/100) * 40))); me->SetBaseWeaponDamage(BASE_ATTACK, MAXDAMAGE, (cinfo->maxdmg +((cinfo->maxdmg/100) * 40))); me->UpdateDamagePhysical(BASE_ATTACK); + */ + me->HandleStatModifier(UNIT_MOD_DAMAGE_MAINHAND, TOTAL_PCT, 40.0f, true); // hack DoResetThreat(); events.ScheduleEvent(EVENT_FRENZY, 30000, 0, PHASE_TWO); // Phase 2 events.ScheduleEvent(EVENT_FORCEPUNCH, 4000, 0, PHASE_TWO); // Phase 2 diff --git a/src/server/scripts/EasternKingdoms/ZulGurub/instance_zulgurub.cpp b/src/server/scripts/EasternKingdoms/ZulGurub/instance_zulgurub.cpp index 673450f83d0..67d40abaea3 100644 --- a/src/server/scripts/EasternKingdoms/ZulGurub/instance_zulgurub.cpp +++ b/src/server/scripts/EasternKingdoms/ZulGurub/instance_zulgurub.cpp @@ -27,6 +27,12 @@ EndScriptData */ #include "InstanceScript.h" #include "zulgurub.h" +DoorData const doorData[] = +{ + { GO_FORCEFIELD, DATA_ARLOKK, DOOR_TYPE_ROOM, BOUNDARY_NONE }, + { 0, 0, DOOR_TYPE_ROOM, BOUNDARY_NONE } // END +}; + class instance_zulgurub : public InstanceMapScript { public: instance_zulgurub(): InstanceMapScript(ZGScriptName, 309) { } @@ -36,6 +42,7 @@ class instance_zulgurub : public InstanceMapScript instance_zulgurub_InstanceMapScript(Map* map) : InstanceScript(map) { SetBossNumber(EncounterCount); + LoadDoorData(doorData); } void Initialize() OVERRIDE @@ -46,7 +53,6 @@ class instance_zulgurub : public InstanceMapScript _jindoTheHexxerGUID = 0; _vilebranchSpeakerGUID = 0; _arlokkGUID = 0; - _goForcefieldGUID = 0; _goGongOfBethekkGUID = 0; } @@ -86,7 +92,7 @@ class instance_zulgurub : public InstanceMapScript switch (go->GetEntry()) { case GO_FORCEFIELD: - _goForcefieldGUID = go->GetGUID(); + AddDoor(go, true); break; case GO_GONG_OF_BETHEKK: _goGongOfBethekkGUID = go->GetGUID(); @@ -100,6 +106,18 @@ class instance_zulgurub : public InstanceMapScript } } + void OnGameObjectRemove(GameObject* go) OVERRIDE + { + switch (go->GetEntry()) + { + case GO_FORCEFIELD: + AddDoor(go, false); + break; + default: + break; + } + } + uint64 GetData64(uint32 uiData) const OVERRIDE { switch (uiData) @@ -119,9 +137,6 @@ class instance_zulgurub : public InstanceMapScript case NPC_ARLOKK: return _arlokkGUID; break; - case GO_FORCEFIELD: - return _goForcefieldGUID; - break; case GO_GONG_OF_BETHEKK: return _goGongOfBethekkGUID; break; @@ -181,7 +196,6 @@ class instance_zulgurub : public InstanceMapScript uint64 _jindoTheHexxerGUID; uint64 _vilebranchSpeakerGUID; uint64 _arlokkGUID; - uint64 _goForcefieldGUID; uint64 _goGongOfBethekkGUID; }; diff --git a/src/server/scripts/EasternKingdoms/ZulGurub/zulgurub.h b/src/server/scripts/EasternKingdoms/ZulGurub/zulgurub.h index c92e8b8724d..a9386ff1782 100644 --- a/src/server/scripts/EasternKingdoms/ZulGurub/zulgurub.h +++ b/src/server/scripts/EasternKingdoms/ZulGurub/zulgurub.h @@ -66,13 +66,9 @@ enum GameobjectIds }; template<class AI> -CreatureAI* GetZulGurubAI(Creature* creature) +AI* GetZulGurubAI(Creature* creature) { - if (InstanceMap* instance = creature->GetMap()->ToInstanceMap()) - if (instance->GetInstanceScript()) - if (instance->GetScriptId() == sObjectMgr->GetScriptId(ZGScriptName)) - return new AI(creature); - return NULL; + return GetInstanceAI<AI>(creature, ZGScriptName); } #endif diff --git a/src/server/scripts/EasternKingdoms/zone_stormwind_city.cpp b/src/server/scripts/EasternKingdoms/zone_stormwind_city.cpp index 4bfbff50dd5..0cd1403d48a 100644 --- a/src/server/scripts/EasternKingdoms/zone_stormwind_city.cpp +++ b/src/server/scripts/EasternKingdoms/zone_stormwind_city.cpp @@ -233,10 +233,7 @@ public: struct npc_lord_gregor_lescovarAI : public npc_escortAI { - npc_lord_gregor_lescovarAI(Creature* creature) : npc_escortAI(creature) - { - creature->RestoreFaction(); - } + npc_lord_gregor_lescovarAI(Creature* creature) : npc_escortAI(creature) { } uint32 uiTimer; uint32 uiPhase; diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_anetheron.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_anetheron.cpp index a4f9a364684..c7803f23e1b 100644 --- a/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_anetheron.cpp +++ b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_anetheron.cpp @@ -72,14 +72,15 @@ public: AuraTimer = 5000; InfernoTimer = 45000; - if (instance && IsEvent) + if (IsEvent) instance->SetData(DATA_ANETHERONEVENT, NOT_STARTED); } void EnterCombat(Unit* /*who*/) OVERRIDE { - if (instance && IsEvent) + if (IsEvent) instance->SetData(DATA_ANETHERONEVENT, IN_PROGRESS); + Talk(SAY_ONAGGRO); } @@ -91,7 +92,7 @@ public: void WaypointReached(uint32 waypointId) OVERRIDE { - if (waypointId == 7 && instance) + if (waypointId == 7) { Unit* target = Unit::GetUnit(*me, instance->GetData64(DATA_JAINAPROUDMOORE)); if (target && target->IsAlive()) @@ -102,7 +103,7 @@ public: void JustDied(Unit* killer) OVERRIDE { hyjal_trashAI::JustDied(killer); - if (instance && IsEvent) + if (IsEvent) instance->SetData(DATA_ANETHERONEVENT, DONE); Talk(SAY_ONDEATH); } @@ -225,7 +226,7 @@ public: { if (AnetheronGUID) { - Creature* boss = Unit::GetCreature((*me), AnetheronGUID); + Creature* boss = ObjectAccessor::GetCreature(*me, AnetheronGUID); if (!boss || (boss && boss->isDead())) { me->setDeathState(JUST_DIED); diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_azgalor.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_azgalor.cpp index 6d296945659..4decce7482f 100644 --- a/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_azgalor.cpp +++ b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_azgalor.cpp @@ -78,14 +78,15 @@ public: EnrageTimer = 600000; enraged = false; - if (instance && IsEvent) + if (IsEvent) instance->SetData(DATA_AZGALOREVENT, NOT_STARTED); } void EnterCombat(Unit* /*who*/) OVERRIDE { - if (instance && IsEvent) + if (IsEvent) instance->SetData(DATA_AZGALOREVENT, IN_PROGRESS); + Talk(SAY_ONAGGRO); } @@ -107,7 +108,7 @@ public: void JustDied(Unit* killer) OVERRIDE { hyjal_trashAI::JustDied(killer); - if (instance && IsEvent) + if (IsEvent) instance->SetData(DATA_AZGALOREVENT, DONE); Talk(SAY_ONDEATH); } @@ -237,7 +238,7 @@ public: { if (AzgalorGUID) { - Creature* boss = Unit::GetCreature((*me), AzgalorGUID); + Creature* boss = ObjectAccessor::GetCreature(*me, AzgalorGUID); if (!boss || (boss && boss->isDead())) { me->setDeathState(JUST_DIED); diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_kazrogal.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_kazrogal.cpp index 7a5870809f7..af7b0c1d899 100644 --- a/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_kazrogal.cpp +++ b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_kazrogal.cpp @@ -74,13 +74,13 @@ public: MarkTimer = 45000; MarkTimerBase = 45000; - if (instance && IsEvent) + if (IsEvent) instance->SetData(DATA_KAZROGALEVENT, NOT_STARTED); } void EnterCombat(Unit* /*who*/) OVERRIDE { - if (instance && IsEvent) + if (IsEvent) instance->SetData(DATA_KAZROGALEVENT, IN_PROGRESS); Talk(SAY_ONAGGRO); } @@ -103,7 +103,7 @@ public: void JustDied(Unit* killer) OVERRIDE { hyjal_trashAI::JustDied(killer); - if (instance && IsEvent) + if (IsEvent) instance->SetData(DATA_KAZROGALEVENT, DONE); DoPlaySoundToSet(me, SOUND_ONDEATH); } diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_rage_winterchill.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_rage_winterchill.cpp index 4d6a94b6e73..691207a4682 100644 --- a/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_rage_winterchill.cpp +++ b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_rage_winterchill.cpp @@ -69,13 +69,13 @@ public: NovaTimer = 15000; IceboltTimer = 10000; - if (instance && IsEvent) + if (IsEvent) instance->SetData(DATA_RAGEWINTERCHILLEVENT, NOT_STARTED); } void EnterCombat(Unit* /*who*/) OVERRIDE { - if (instance && IsEvent) + if (IsEvent) instance->SetData(DATA_RAGEWINTERCHILLEVENT, IN_PROGRESS); Talk(SAY_ONAGGRO); } @@ -98,7 +98,7 @@ public: void JustDied(Unit* killer) OVERRIDE { hyjal_trashAI::JustDied(killer); - if (instance && IsEvent) + if (IsEvent) instance->SetData(DATA_RAGEWINTERCHILLEVENT, DONE); Talk(SAY_ONDEATH); } diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjalAI.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjalAI.cpp index 3b3cacf7d3f..c8006158ef1 100644 --- a/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjalAI.cpp +++ b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjalAI.cpp @@ -705,7 +705,7 @@ void hyjalAI::UpdateAI(uint32 diff) switch (me->GetEntry()) { case JAINA: - if (instance && instance->GetData(DATA_ALLIANCE_RETREAT)) + if (instance->GetData(DATA_ALLIANCE_RETREAT)) { me->SetVisible(false); HideNearPos(me->GetPositionX(), me->GetPositionY()); @@ -717,7 +717,7 @@ void hyjalAI::UpdateAI(uint32 diff) else me->SetVisible(true); break; case THRALL: //thrall - if (instance && instance->GetData(DATA_HORDE_RETREAT)) + if (instance->GetData(DATA_HORDE_RETREAT)) { me->SetVisible(false); HideNearPos(me->GetPositionX(), me->GetPositionY()); @@ -781,7 +781,7 @@ void hyjalAI::UpdateAI(uint32 diff) if (Summon) { - if (instance && EnemyCount) + if (EnemyCount) { EnemyCount = instance->GetData(DATA_TRASH); if (!EnemyCount) diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjal_trash.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjal_trash.cpp index 2688fbbdaff..cbace6df028 100644 --- a/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjal_trash.cpp +++ b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjal_trash.cpp @@ -443,7 +443,7 @@ public: void WaypointReached(uint32 waypointId) OVERRIDE { - if (waypointId == 0 && instance && !IsOverrun) + if (waypointId == 0 && !IsOverrun) { if (instance->GetData(DATA_ALLIANCE_RETREAT))//2.alliance boss down, attack thrall { @@ -559,7 +559,7 @@ public: void WaypointReached(uint32 waypointId) OVERRIDE { - if (waypointId == 7 && instance && !IsOverrun) + if (waypointId == 7 && !IsOverrun) { if (instance->GetData(DATA_ALLIANCE_RETREAT))//2.alliance boss down, attack thrall { @@ -658,7 +658,7 @@ public: void WaypointReached(uint32 waypointId) OVERRIDE { - if (waypointId == 7 && instance && !IsOverrun) + if (waypointId == 7 && !IsOverrun) { if (instance->GetData(DATA_ALLIANCE_RETREAT))//2.alliance boss down, attack thrall { @@ -769,7 +769,7 @@ public: void WaypointReached(uint32 waypointId) OVERRIDE { - if (waypointId == 7 && instance && !IsOverrun) + if (waypointId == 7 && !IsOverrun) { if (instance->GetData(DATA_ALLIANCE_RETREAT))//2.alliance boss down, attack thrall { @@ -882,7 +882,7 @@ public: void WaypointReached(uint32 waypointId) OVERRIDE { - if (waypointId == 7 && instance && !IsOverrun) + if (waypointId == 7 && !IsOverrun) { if (instance->GetData(DATA_ALLIANCE_RETREAT))//2.alliance boss down, attack thrall { @@ -978,7 +978,7 @@ public: void WaypointReached(uint32 waypointId) OVERRIDE { - if (waypointId == 7 && instance && !IsOverrun) + if (waypointId == 7 && !IsOverrun) { if (instance->GetData(DATA_ALLIANCE_RETREAT))//2.alliance boss down, attack thrall { @@ -1064,7 +1064,7 @@ public: void WaypointReached(uint32 waypointId) OVERRIDE { - if (waypointId == 7 && instance && !IsOverrun) + if (waypointId == 7 && !IsOverrun) { if (instance->GetData(DATA_ALLIANCE_RETREAT))//2.alliance boss down, attack thrall { @@ -1153,7 +1153,7 @@ public: void WaypointReached(uint32 waypointId) OVERRIDE { - if (waypointId == 2 && instance && !IsOverrun) + if (waypointId == 2 && !IsOverrun) { Unit* target = Unit::GetUnit(*me, instance->GetData64(DATA_THRALL)); if (target && target->IsAlive()) @@ -1166,7 +1166,7 @@ public: void JustDied(Unit* /*killer*/) OVERRIDE { - if (instance && IsEvent) + if (IsEvent) instance->SetData(DATA_TRASH, 0);//signal trash is dead float x, y, z; @@ -1181,11 +1181,13 @@ public: void UpdateAI(uint32 diff) OVERRIDE { hyjal_trashAI::UpdateAI(diff); + if (IsEvent || IsOverrun) { CAST_AI(hyjal_trashAI, me->AI())->SetCanAttack(false); npc_escortAI::UpdateAI(diff); } + if (IsEvent) { if (!go) @@ -1197,7 +1199,9 @@ public: AddWaypoint(i, FrostWyrmWPs[i][0], FrostWyrmWPs[i][1], FrostWyrmWPs[i][2]); Start(false, true); SetDespawnAtEnd(false); - }else{//fly path FlyPathWPs + } + else + {//fly path FlyPathWPs for (uint8 i = 0; i < 3; ++i) AddWaypoint(i, FlyPathWPs[i][0]+irand(-10, 10), FlyPathWPs[i][1]+irand(-10, 10), FlyPathWPs[i][2]); Start(false, true); @@ -1205,9 +1209,12 @@ public: } } } + if (!UpdateVictim()) return; - if (!me->IsWithinDist(me->GetVictim(), 25)){ + + if (!me->IsWithinDist(me->GetVictim(), 25)) + { if (MoveTimer <= diff) { me->GetMotionMaster()->MoveChase(me->GetVictim()); @@ -1227,7 +1234,6 @@ public: } else FrostBreathTimer -= diff; } }; - }; class npc_gargoyle : public CreatureScript @@ -1246,7 +1252,8 @@ public: { instance = creature->GetInstanceScript(); go = false; - DummyTarget[0] = 0;DummyTarget[1] = 0;DummyTarget[2] = 0; + for (uint8 i = 0; i < 3; ++i) + DummyTarget[i] = 0; Reset(); } @@ -1267,7 +1274,7 @@ public: void WaypointReached(uint32 waypointId) OVERRIDE { - if (waypointId == 2 && instance && !IsOverrun) + if (waypointId == 2 && !IsOverrun) { Unit* target = Unit::GetUnit(*me, instance->GetData64(DATA_THRALL)); if (target && target->IsAlive()) @@ -1291,11 +1298,13 @@ public: void UpdateAI(uint32 diff) OVERRIDE { hyjal_trashAI::UpdateAI(diff); + if (IsEvent || IsOverrun) { CAST_AI(hyjal_trashAI, me->AI())->SetCanAttack(false); npc_escortAI::UpdateAI(diff); } + if (IsEvent) { if (!go) @@ -1315,6 +1324,7 @@ public: } } } + if (IsOverrun && !UpdateVictim()) { if (faction == 0)//alliance @@ -1326,8 +1336,10 @@ public: } else StrikeTimer -= diff; } } + if (!UpdateVictim()) return; + if (!me->IsWithinDist(me->GetVictim(), 20) || forcemove) { forcemove = false; @@ -1347,6 +1359,7 @@ public: MoveTimer = 2000; } else MoveTimer-=diff; } + if (StrikeTimer <= diff) { if (me->IsWithinDist(me->GetVictim(), 20)) @@ -1359,7 +1372,6 @@ public: } else StrikeTimer -= diff; } }; - }; class alliance_rifleman : public CreatureScript 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 e4f1324d19c..7c0169cda95 100644 --- a/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_mal_ganis.cpp +++ b/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_mal_ganis.cpp @@ -147,7 +147,7 @@ public: return; } - if (Creature* pArthas = me->GetCreature(*me, instance ? instance->GetData64(DATA_ARTHAS) : 0)) + if (Creature* pArthas = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_ARTHAS))) if (pArthas->isDead()) { EnterEvadeMode(); @@ -196,7 +196,7 @@ public: uiOutroTimer = 8000; break; case 2: - me->SetTarget(instance ? instance->GetData64(DATA_ARTHAS) : 0); + me->SetTarget(instance->GetData64(DATA_ARTHAS)); me->HandleEmoteCommand(29); Talk(SAY_ESCAPE_SPEECH_2); ++uiOutroStep; diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/EscapeFromDurnholdeKeep/boss_captain_skarloc.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/EscapeFromDurnholdeKeep/boss_captain_skarloc.cpp index 061c7fdfc62..5b1db051a56 100644 --- a/src/server/scripts/Kalimdor/CavernsOfTime/EscapeFromDurnholdeKeep/boss_captain_skarloc.cpp +++ b/src/server/scripts/Kalimdor/CavernsOfTime/EscapeFromDurnholdeKeep/boss_captain_skarloc.cpp @@ -99,7 +99,7 @@ public: { Talk(SAY_DEATH); - if (instance && instance->GetData(TYPE_THRALL_EVENT) == IN_PROGRESS) + if (instance->GetData(TYPE_THRALL_EVENT) == IN_PROGRESS) instance->SetData(TYPE_THRALL_PART1, DONE); } diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/EscapeFromDurnholdeKeep/boss_epoch_hunter.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/EscapeFromDurnholdeKeep/boss_epoch_hunter.cpp index cb25d96acf3..4d75bc0545c 100644 --- a/src/server/scripts/Kalimdor/CavernsOfTime/EscapeFromDurnholdeKeep/boss_epoch_hunter.cpp +++ b/src/server/scripts/Kalimdor/CavernsOfTime/EscapeFromDurnholdeKeep/boss_epoch_hunter.cpp @@ -91,7 +91,7 @@ public: { Talk(SAY_DEATH); - if (instance && instance->GetData(TYPE_THRALL_EVENT) == IN_PROGRESS) + if (instance->GetData(TYPE_THRALL_EVENT) == IN_PROGRESS) instance->SetData(TYPE_THRALL_PART4, DONE); } diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/EscapeFromDurnholdeKeep/old_hillsbrad.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/EscapeFromDurnholdeKeep/old_hillsbrad.cpp index 6e4ef814dbe..bf902ba403c 100644 --- a/src/server/scripts/Kalimdor/CavernsOfTime/EscapeFromDurnholdeKeep/old_hillsbrad.cpp +++ b/src/server/scripts/Kalimdor/CavernsOfTime/EscapeFromDurnholdeKeep/old_hillsbrad.cpp @@ -82,7 +82,7 @@ public: player->PrepareQuestMenu(creature->GetGUID()); InstanceScript* instance = creature->GetInstanceScript(); - if (instance && instance->GetData(TYPE_BARREL_DIVERSION) != DONE && !player->HasItemCount(ITEM_ENTRY_BOMBS)) + if (instance->GetData(TYPE_BARREL_DIVERSION) != DONE && !player->HasItemCount(ITEM_ENTRY_BOMBS)) player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_HELLO_EROZION1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1); if (player->GetQuestStatus(QUEST_ENTRY_RETURN) == QUEST_STATUS_COMPLETE) @@ -92,7 +92,6 @@ public: return true; } - }; /*###### @@ -585,18 +584,14 @@ public: { player->CLOSE_GOSSIP_MENU(); - if (instance && instance->GetData(TYPE_THRALL_EVENT) == IN_PROGRESS) + if (instance->GetData(TYPE_THRALL_EVENT) == IN_PROGRESS) { instance->SetData(TYPE_THRALL_PART4, IN_PROGRESS); if (instance->GetData64(DATA_EPOCH) == 0) creature->SummonCreature(ENTRY_EPOCH, 2639.13f, 698.55f, 65.43f, 4.59f, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 120000); - if (uint64 ThrallGUID = instance->GetData64(DATA_THRALL)) - { - Creature* Thrall = (Unit::GetCreature((*creature), ThrallGUID)); - if (Thrall) - CAST_AI(npc_thrall_old_hillsbrad::npc_thrall_old_hillsbradAI, Thrall->AI())->StartWP(); - } + if (Creature* thrall = (Unit::GetCreature(*creature, instance->GetData64(DATA_THRALL)))) + CAST_AI(npc_thrall_old_hillsbrad::npc_thrall_old_hillsbradAI, thrall->AI())->StartWP(); } } return true; @@ -605,7 +600,7 @@ public: bool OnGossipHello(Player* player, Creature* creature) OVERRIDE { InstanceScript* instance = creature->GetInstanceScript(); - if (instance && instance->GetData(TYPE_THRALL_PART3) == DONE && instance->GetData(TYPE_THRALL_PART4) == NOT_STARTED) + if (instance->GetData(TYPE_THRALL_PART3) == DONE && instance->GetData(TYPE_THRALL_PART4) == NOT_STARTED) { player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_ITEM_EPOCH1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1); player->SEND_GOSSIP_MENU(GOSSIP_ID_EPOCH1, creature->GetGUID()); diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/TheBlackMorass/the_black_morass.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/TheBlackMorass/the_black_morass.cpp index f1406a5a008..58bda23fb36 100644 --- a/src/server/scripts/Kalimdor/CavernsOfTime/TheBlackMorass/the_black_morass.cpp +++ b/src/server/scripts/Kalimdor/CavernsOfTime/TheBlackMorass/the_black_morass.cpp @@ -138,8 +138,8 @@ public: void AttackStart(Unit* /*who*/) OVERRIDE { - //if (instance && instance->GetData(TYPE_MEDIVH) == IN_PROGRESS) - //return; + //if (instance->GetData(TYPE_MEDIVH) == IN_PROGRESS) + // return; //ScriptedAI::AttackStart(who); } @@ -297,7 +297,7 @@ public: if (!creature_entry) return; - if (instance && instance->GetData(TYPE_MEDIVH) != IN_PROGRESS) + if (instance->GetData(TYPE_MEDIVH) != IN_PROGRESS) { me->InterruptNonMeleeSpells(true); me->RemoveAllAuras(); @@ -311,7 +311,7 @@ public: pos.m_positionZ = std::max(me->GetMap()->GetHeight(pos.m_positionX, pos.m_positionY, MAX_HEIGHT), me->GetMap()->GetWaterLevel(pos.m_positionX, pos.m_positionY)); if (Unit* Summon = DoSummon(creature_entry, pos, 30000, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT)) - if (Unit* temp = Unit::GetUnit(*me, instance ? instance->GetData64(DATA_MEDIVH) : 0)) + if (Unit* temp = ObjectAccessor::GetUnit(*me, instance->GetData64(DATA_MEDIVH))) Summon->AddThreat(temp, 0.0f); } diff --git a/src/server/scripts/Kalimdor/OnyxiasLair/boss_onyxia.cpp b/src/server/scripts/Kalimdor/OnyxiasLair/boss_onyxia.cpp index 7381594a1ce..29e08699a0f 100644 --- a/src/server/scripts/Kalimdor/OnyxiasLair/boss_onyxia.cpp +++ b/src/server/scripts/Kalimdor/OnyxiasLair/boss_onyxia.cpp @@ -340,7 +340,7 @@ public: Trinity::GameObjectInRangeCheck check(me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), 15); Trinity::GameObjectLastSearcher<Trinity::GameObjectInRangeCheck> searcher(me, Floor, check); me->VisitNearbyGridObject(30, searcher); - if (instance && Floor) + if (Floor) instance->SetData64(DATA_FLOOR_ERUPTION_GUID, Floor->GetGUID()); events.ScheduleEvent(EVENT_BELLOWING_ROAR, 30000); break; diff --git a/src/server/scripts/Kalimdor/RazorfenDowns/boss_glutton.cpp b/src/server/scripts/Kalimdor/RazorfenDowns/boss_glutton.cpp index d29831b8cde..830c3fed382 100644 --- a/src/server/scripts/Kalimdor/RazorfenDowns/boss_glutton.cpp +++ b/src/server/scripts/Kalimdor/RazorfenDowns/boss_glutton.cpp @@ -40,7 +40,10 @@ public: struct boss_gluttonAI : public BossAI { - boss_gluttonAI(Creature* creature) : BossAI(creature, DATA_GLUTTON) { } + boss_gluttonAI(Creature* creature) : BossAI(creature, DATA_GLUTTON) + { + hp15 = false; + } void Reset() OVERRIDE { diff --git a/src/server/scripts/Kalimdor/RazorfenDowns/razorfen_downs.cpp b/src/server/scripts/Kalimdor/RazorfenDowns/razorfen_downs.cpp index 3b4defeca56..b9605794074 100644 --- a/src/server/scripts/Kalimdor/RazorfenDowns/razorfen_downs.cpp +++ b/src/server/scripts/Kalimdor/RazorfenDowns/razorfen_downs.cpp @@ -158,6 +158,7 @@ public: { instance = creature->GetInstanceScript(); eventInProgress = false; + spawnerCount = 0; } void Reset() OVERRIDE @@ -177,9 +178,7 @@ public: void EnterCombat(Unit* who) OVERRIDE { if (channeling) - { Talk(SAY_WATCH_OUT, who); - } else { events.ScheduleEvent(EVENT_FIREBALL, 1000); diff --git a/src/server/scripts/Kalimdor/RazorfenDowns/razorfen_downs.h b/src/server/scripts/Kalimdor/RazorfenDowns/razorfen_downs.h index 4778677e067..a9a5a82f127 100644 --- a/src/server/scripts/Kalimdor/RazorfenDowns/razorfen_downs.h +++ b/src/server/scripts/Kalimdor/RazorfenDowns/razorfen_downs.h @@ -61,13 +61,9 @@ enum GameObjectIds }; template<class AI> -CreatureAI* GetRazorfenDownsAI(Creature* creature) +AI* GetRazorfenDownsAI(Creature* creature) { - if (InstanceMap* instance = creature->GetMap()->ToInstanceMap()) - if (instance->GetInstanceScript()) - if (instance->GetScriptId() == sObjectMgr->GetScriptId(RFDScriptName)) - return new AI(creature); - return NULL; + return GetInstanceAI<AI>(creature, RFDScriptName); } #endif diff --git a/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_bug_trio.cpp b/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_bug_trio.cpp index c1897ff48ad..433193bd703 100644 --- a/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_bug_trio.cpp +++ b/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_bug_trio.cpp @@ -119,7 +119,7 @@ public: //Checking if Vem is dead. If yes we will enrage. if (Check_Timer <= diff) { - if (instance && instance->GetData(DATA_VEMISDEAD)) + if (instance->GetData(DATA_VEMISDEAD)) { DoCast(me, SPELL_ENRAGE); VemDead = true; diff --git a/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_twinemperors.cpp b/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_twinemperors.cpp index 81171eef580..d84279f1e8b 100644 --- a/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_twinemperors.cpp +++ b/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_twinemperors.cpp @@ -502,8 +502,6 @@ public: //Added. Can be removed if its included in DB. me->ApplySpellImmune(0, IMMUNITY_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, true); - me->SetBaseWeaponDamage(BASE_ATTACK, MINDAMAGE, 0); - me->SetBaseWeaponDamage(BASE_ATTACK, MAXDAMAGE, 0); } void CastSpellOnBug(Creature* target) diff --git a/src/server/scripts/Kalimdor/zone_ashenvale.cpp b/src/server/scripts/Kalimdor/zone_ashenvale.cpp index 41c0441bca5..ec28ee42625 100644 --- a/src/server/scripts/Kalimdor/zone_ashenvale.cpp +++ b/src/server/scripts/Kalimdor/zone_ashenvale.cpp @@ -198,7 +198,7 @@ public: void sQuestAccept(Player* player, Quest const* quest) { - if (quest->GetQuestId() == QUEST_TOREK_ASSULT) + if (quest->GetQuestId() == QUEST_FREEDOM_TO_RUUL) { me->setFaction(FACTION_QUEST); npc_escortAI::Start(true, false, player->GetGUID()); diff --git a/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/boss_elder_nadox.cpp b/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/boss_elder_nadox.cpp index 0b281c58839..84c9181e495 100644 --- a/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/boss_elder_nadox.cpp +++ b/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/boss_elder_nadox.cpp @@ -232,7 +232,6 @@ public: npc_nadox_eggsAI(Creature* creature) : ScriptedAI(creature) { creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE | UNIT_FLAG_NON_ATTACKABLE); - creature->UpdateAllStats(); } void Reset() OVERRIDE { } diff --git a/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/boss_jedoga_shadowseeker.cpp b/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/boss_jedoga_shadowseeker.cpp index 1890dfb4ff8..f599e6e7c27 100644 --- a/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/boss_jedoga_shadowseeker.cpp +++ b/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/boss_jedoga_shadowseeker.cpp @@ -394,7 +394,7 @@ public: void AttackStart(Unit* victim) OVERRIDE { - if ((instance && instance->GetBossState(DATA_JEDOGA_SHADOWSEEKER) == IN_PROGRESS) || !victim) + if ((instance->GetBossState(DATA_JEDOGA_SHADOWSEEKER) == IN_PROGRESS) || !victim) return; ScriptedAI::AttackStart(victim); @@ -403,7 +403,7 @@ public: void MoveInLineOfSight(Unit* who) OVERRIDE { - if ((instance && instance->GetBossState(DATA_JEDOGA_SHADOWSEEKER) == IN_PROGRESS) || !who) + if ((instance->GetBossState(DATA_JEDOGA_SHADOWSEEKER) == IN_PROGRESS) || !who) return; ScriptedAI::MoveInLineOfSight(who); @@ -432,7 +432,7 @@ public: void UpdateAI(uint32 diff) OVERRIDE { - if (instance && bCheckTimer <= diff) + if (bCheckTimer <= diff) { if (me->GetGUID() == instance->GetData64(DATA_ADD_JEDOGA_OPFER) && !bWalking) { diff --git a/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/boss_prince_taldaram.cpp b/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/boss_prince_taldaram.cpp index 77d3ce21d0c..efe439de440 100644 --- a/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/boss_prince_taldaram.cpp +++ b/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/boss_prince_taldaram.cpp @@ -17,76 +17,75 @@ #include "ScriptMgr.h" #include "ScriptedCreature.h" +#include "SpellScript.h" #include "Player.h" #include "ahnkahet.h" enum Spells { - SPELL_BLOODTHIRST = 55968, // Trigger Spell + add aura - SPELL_CONJURE_FLAME_SPHERE = 55931, - SPELL_FLAME_SPHERE_SUMMON_1 = 55895, // 1x 30106 - H_SPELL_FLAME_SPHERE_SUMMON_1 = 59511, // 1x 31686 - H_SPELL_FLAME_SPHERE_SUMMON_2 = 59512, // 1x 31687 - SPELL_FLAME_SPHERE_SPAWN_EFFECT = 55891, - SPELL_FLAME_SPHERE_VISUAL = 55928, - SPELL_FLAME_SPHERE_PERIODIC = 55926, - SPELL_FLAME_SPHERE_DEATH_EFFECT = 55947, - SPELL_BEAM_VISUAL = 60342, - SPELL_EMBRACE_OF_THE_VAMPYR = 55959, - SPELL_VANISH = 55964, - CREATURE_FLAME_SPHERE = 30106, - H_CREATURE_FLAME_SPHERE_1 = 31686, - H_CREATURE_FLAME_SPHERE_2 = 31687, - SPELL_HOVER_FALL = 60425 + SPELL_BLOODTHIRST = 55968, // Trigger Spell + add aura + SPELL_CONJURE_FLAME_SPHERE = 55931, + SPELL_FLAME_SPHERE_SUMMON_1 = 55895, // 1x 30106 + SPELL_FLAME_SPHERE_SUMMON_2 = 59511, // 1x 31686 + SPELL_FLAME_SPHERE_SUMMON_3 = 59512, // 1x 31687 + SPELL_FLAME_SPHERE_SPAWN_EFFECT = 55891, + SPELL_FLAME_SPHERE_VISUAL = 55928, + SPELL_FLAME_SPHERE_PERIODIC = 55926, + SPELL_FLAME_SPHERE_DEATH_EFFECT = 55947, + SPELL_EMBRACE_OF_THE_VAMPYR = 55959, + SPELL_VANISH = 55964, + + NPC_FLAME_SPHERE_1 = 30106, + NPC_FLAME_SPHERE_2 = 31686, + NPC_FLAME_SPHERE_3 = 31687, + + SPELL_BEAM_VISUAL = 60342, + SPELL_HOVER_FALL = 60425 }; enum Misc { - DATA_EMBRACE_DMG = 20000, - H_DATA_EMBRACE_DMG = 40000, - DATA_SPHERE_DISTANCE = 15 + DATA_EMBRACE_DMG = 20000, + H_DATA_EMBRACE_DMG = 40000 }; -#define DATA_SPHERE_ANGLE_OFFSET 0.7f -#define DATA_GROUND_POSITION_Z 11.30809f +#define DATA_SPHERE_DISTANCE 25.0f +#define DATA_SPHERE_ANGLE_OFFSET M_PI / 2 +#define DATA_GROUND_POSITION_Z 11.30809f enum Yells { - SAY_1 = 0, - SAY_WARNING = 1, - SAY_AGGRO = 2, - SAY_SLAY = 3, - SAY_DEATH = 4, - SAY_FEED = 5, - SAY_VANISH = 6 + SAY_1 = 0, + SAY_WARNING = 1, + SAY_AGGRO = 2, + SAY_SLAY = 3, + SAY_DEATH = 4, + SAY_FEED = 5, + SAY_VANISH = 6 }; enum Events { - EVENT_CASTING_FLAME_SPHERES = 1, + EVENT_CONJURE_FLAME_SPHERES = 1, + EVENT_BLOODTHIRST, + EVENT_VANISH, EVENT_JUST_VANISHED, EVENT_VANISHED, EVENT_FEEDING, - EVENT_BLOODTHIRST, - EVENT_FLAME_SPHERE, - EVENT_VANISH -}; - -enum Phase -{ - PHASE_NORMAL = 1, - PHASE_SPECIAL = 2 + // Flame Sphere + EVENT_START_MOVE, + EVENT_DESPAWN }; -class boss_taldaram : public CreatureScript +class boss_prince_taldaram : public CreatureScript { public: - boss_taldaram() : CreatureScript("boss_taldaram") { } + boss_prince_taldaram() : CreatureScript("boss_prince_taldaram") { } - struct boss_taldaramAI : public BossAI + struct boss_prince_taldaramAI : public BossAI { - boss_taldaramAI(Creature* creature) : BossAI(creature, DATA_PRINCE_TALDARAM) + boss_prince_taldaramAI(Creature* creature) : BossAI(creature, DATA_PRINCE_TALDARAM) { me->SetDisableGravity(true); } @@ -94,6 +93,7 @@ class boss_taldaram : public CreatureScript void Reset() OVERRIDE { _Reset(); + _flameSphereTargetGUID = 0; _embraceTargetGUID = 0; _embraceTakenDamage = 0; } @@ -102,10 +102,24 @@ class boss_taldaram : public CreatureScript { _EnterCombat(); Talk(SAY_AGGRO); - events.SetPhase(PHASE_NORMAL); events.ScheduleEvent(EVENT_BLOODTHIRST, 10000); events.ScheduleEvent(EVENT_VANISH, urand(25000, 35000)); - events.ScheduleEvent(EVENT_FLAME_SPHERE, 5000); + events.ScheduleEvent(EVENT_CONJURE_FLAME_SPHERES, 5000); + } + + void JustSummoned(Creature* summon) + { + BossAI::JustSummoned(summon); + + switch (summon->GetEntry()) + { + case NPC_FLAME_SPHERE_1: + case NPC_FLAME_SPHERE_2: + case NPC_FLAME_SPHERE_3: + summon->AI()->SetGUID(_flameSphereTargetGUID); + default: + return; + } } void UpdateAI(uint32 diff) OVERRIDE @@ -122,80 +136,40 @@ class boss_taldaram : public CreatureScript { switch (eventId) { - if (events.IsInPhase(PHASE_NORMAL)) - { - case EVENT_BLOODTHIRST: - DoCast(me, SPELL_BLOODTHIRST); - events.ScheduleEvent(EVENT_BLOODTHIRST, 10000); - break; - case EVENT_FLAME_SPHERE: - DoCastVictim(SPELL_CONJURE_FLAME_SPHERE); - events.SetPhase(PHASE_SPECIAL); - events.ScheduleEvent(EVENT_CASTING_FLAME_SPHERES, 3000); - events.ScheduleEvent(EVENT_FLAME_SPHERE, 15000); - break; - case EVENT_VANISH: + case EVENT_BLOODTHIRST: + DoCast(me, SPELL_BLOODTHIRST); + events.ScheduleEvent(EVENT_BLOODTHIRST, 10000); + break; + case EVENT_CONJURE_FLAME_SPHERES: + // random target? + if (Unit* victim = me->GetVictim()) { - Map::PlayerList const& players = me->GetMap()->GetPlayers(); - uint32 targets = 0; - for (Map::PlayerList::const_iterator i = players.begin(); i != players.end(); ++i) - { - Player* player = i->GetSource(); - if (player && player->IsAlive()) - ++targets; - } - - if (targets > 2) - { - Talk(SAY_VANISH); - DoCast(me, SPELL_VANISH); - events.SetPhase(PHASE_SPECIAL); - events.ScheduleEvent(EVENT_JUST_VANISHED, 500); - if (Unit* embraceTarget = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true)) - _embraceTargetGUID = embraceTarget->GetGUID(); - } - events.ScheduleEvent(EVENT_VANISH, urand(25000, 35000)); - break; + _flameSphereTargetGUID = victim->GetGUID(); + DoCast(victim, SPELL_CONJURE_FLAME_SPHERE); } - } - case EVENT_CASTING_FLAME_SPHERES: + events.ScheduleEvent(EVENT_CONJURE_FLAME_SPHERES, 15000); + break; + case EVENT_VANISH: { - events.SetPhase(PHASE_NORMAL); - Unit* sphereTarget = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true); - if (!sphereTarget) - break; - - float angle, x, y; - - //DoCast(me, SPELL_FLAME_SPHERE_SUMMON_1); - if (Creature* sphere = DoSpawnCreature(CREATURE_FLAME_SPHERE, 0, 0, 5, 0, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 10 * IN_MILLISECONDS)) + Map::PlayerList const& players = me->GetMap()->GetPlayers(); + uint32 targets = 0; + for (Map::PlayerList::const_iterator i = players.begin(); i != players.end(); ++i) { - angle = sphere->GetAngle(sphereTarget); - x = sphere->GetPositionX() + DATA_SPHERE_DISTANCE * std::cos(angle); - y = sphere->GetPositionY() + DATA_SPHERE_DISTANCE * std::sin(angle); - sphere->GetMotionMaster()->MovePoint(0, x, y, sphere->GetPositionZ()); + Player* player = i->GetSource(); + if (player && player->IsAlive()) + ++targets; } - if (IsHeroic()) + if (targets > 2) { - //DoCast(me, H_SPELL_FLAME_SPHERE_SUMMON_1); - if (Creature* sphere = DoSpawnCreature(H_CREATURE_FLAME_SPHERE_1, 0, 0, 5, 0, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 10 * IN_MILLISECONDS)) - { - angle = sphere->GetAngle(sphereTarget) + DATA_SPHERE_ANGLE_OFFSET; - x = sphere->GetPositionX() + DATA_SPHERE_DISTANCE/2 * std::cos(angle); - y = sphere->GetPositionY() + DATA_SPHERE_DISTANCE/2 * std::sin(angle); - sphere->GetMotionMaster()->MovePoint(0, x, y, sphere->GetPositionZ()); - } - - //DoCast(me, H_SPELL_FLAME_SPHERE_SUMMON_2); - if (Creature* sphere = DoSpawnCreature(H_CREATURE_FLAME_SPHERE_2, 0, 0, 5, 0, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 10 * IN_MILLISECONDS)) - { - angle = sphere->GetAngle(sphereTarget) - DATA_SPHERE_ANGLE_OFFSET; - x = sphere->GetPositionX() + DATA_SPHERE_DISTANCE/2 * std::cos(angle); - y = sphere->GetPositionY() + DATA_SPHERE_DISTANCE/2 * std::sin(angle); - sphere->GetMotionMaster()->MovePoint(0, x, y, sphere->GetPositionZ()); - } + Talk(SAY_VANISH); + DoCast(me, SPELL_VANISH); + events.DelayEvents(500); + events.ScheduleEvent(EVENT_JUST_VANISHED, 500); + if (Unit* embraceTarget = SelectTarget(SELECT_TARGET_RANDOM, 0, 100.0f, true)) + _embraceTargetGUID = embraceTarget->GetGUID(); } + events.ScheduleEvent(EVENT_VANISH, urand(25000, 35000)); break; } case EVENT_JUST_VANISHED: @@ -218,7 +192,6 @@ class boss_taldaram : public CreatureScript break; case EVENT_FEEDING: _embraceTargetGUID = 0; - events.SetPhase(PHASE_NORMAL); break; default: break; @@ -232,13 +205,12 @@ class boss_taldaram : public CreatureScript { Unit* embraceTarget = GetEmbraceTarget(); - if (events.IsInPhase(PHASE_SPECIAL) && embraceTarget && embraceTarget->IsAlive()) + if (embraceTarget && embraceTarget->IsAlive()) { _embraceTakenDamage += damage; if (_embraceTakenDamage > DUNGEON_MODE<uint32>(DATA_EMBRACE_DMG, H_DATA_EMBRACE_DMG)) { _embraceTargetGUID = 0; - events.SetPhase(PHASE_NORMAL); me->CastStop(); } } @@ -255,12 +227,9 @@ class boss_taldaram : public CreatureScript if (victim->GetTypeId() != TYPEID_PLAYER) return; - Unit* embraceTarget = GetEmbraceTarget(); - if (events.IsInPhase(PHASE_SPECIAL) && embraceTarget && victim == embraceTarget) - { + if (victim->GetGUID() == _embraceTargetGUID) _embraceTargetGUID = 0; - events.SetPhase(PHASE_NORMAL); - } + Talk(SAY_SLAY); } @@ -289,76 +258,120 @@ class boss_taldaram : public CreatureScript me->SetHomePosition(me->GetPositionX(), me->GetPositionY(), DATA_GROUND_POSITION_Z, me->GetOrientation()); DoCast(SPELL_HOVER_FALL); me->SetDisableGravity(false); - me->GetMotionMaster()->MovePoint(0, me->GetHomePosition()); + me->GetMotionMaster()->MoveLand(0, me->GetHomePosition()); Talk(SAY_WARNING); instance->HandleGameObject(instance->GetData64(DATA_PRINCE_TALDARAM_PLATFORM), true); } private: + uint64 _flameSphereTargetGUID; uint64 _embraceTargetGUID; uint32 _embraceTakenDamage; }; CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return GetAhnKahetAI<boss_taldaramAI>(creature); + return GetAhnKahetAI<boss_prince_taldaramAI>(creature); } }; -class npc_taldaram_flamesphere : public CreatureScript +// 30106, 31686, 31687 - Flame Sphere +class npc_prince_taldaram_flame_sphere : public CreatureScript { public: - npc_taldaram_flamesphere() : CreatureScript("npc_taldaram_flamesphere") { } + npc_prince_taldaram_flame_sphere() : CreatureScript("npc_prince_taldaram_flame_sphere") { } - struct npc_taldaram_flamesphereAI : public ScriptedAI + struct npc_prince_taldaram_flame_sphereAI : public ScriptedAI { - npc_taldaram_flamesphereAI(Creature* creature) : ScriptedAI(creature) + npc_prince_taldaram_flame_sphereAI(Creature* creature) : ScriptedAI(creature) { } + + void Reset() OVERRIDE { + DoCast(me, SPELL_FLAME_SPHERE_SPAWN_EFFECT, true); + DoCast(me, SPELL_FLAME_SPHERE_VISUAL, true); + + _flameSphereTargetGUID = 0; + _events.Reset(); + _events.ScheduleEvent(EVENT_START_MOVE, 3 * IN_MILLISECONDS); + _events.ScheduleEvent(EVENT_DESPAWN, 13 * IN_MILLISECONDS); } - void Reset() OVERRIDE + void SetGUID(uint64 guid, int32 /*id = 0*/) OVERRIDE { - me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); - //! HACK: Creature's can't have MOVEMENTFLAG_FLYING - me->AddUnitMovementFlag(MOVEMENTFLAG_FLYING); - me->setFaction(16); - me->SetObjectScale(1.0f); - DoCast(me, SPELL_FLAME_SPHERE_VISUAL); - DoCast(me, SPELL_FLAME_SPHERE_SPAWN_EFFECT); - DoCast(me, SPELL_FLAME_SPHERE_PERIODIC); - _despawnTimer = 10 * IN_MILLISECONDS; + _flameSphereTargetGUID = guid; } void EnterCombat(Unit* /*who*/) OVERRIDE { } void MoveInLineOfSight(Unit* /*who*/) OVERRIDE { } - void JustDied(Unit* /*killer*/) OVERRIDE - { - DoCast(me, SPELL_FLAME_SPHERE_DEATH_EFFECT); - } - void UpdateAI(uint32 diff) OVERRIDE { - if (_despawnTimer <= diff) - me->DisappearAndDie(); - else - _despawnTimer -= diff; + _events.Update(diff); + + while (uint32 eventId = _events.ExecuteEvent()) + { + switch (eventId) + { + case EVENT_START_MOVE: + { + DoCast(me, SPELL_FLAME_SPHERE_PERIODIC, true); + + /// @todo: find correct values + float angleOffset = 0.0f; + float distOffset = DATA_SPHERE_DISTANCE; + + switch (me->GetEntry()) + { + case NPC_FLAME_SPHERE_1: + break; + case NPC_FLAME_SPHERE_2: + angleOffset = DATA_SPHERE_ANGLE_OFFSET; + break; + case NPC_FLAME_SPHERE_3: + angleOffset = -DATA_SPHERE_ANGLE_OFFSET; + break; + default: + return; + } + + Unit* sphereTarget = ObjectAccessor::GetUnit(*me, _flameSphereTargetGUID); + if (!sphereTarget) + return; + + float angle = me->GetAngle(sphereTarget) + angleOffset; + float x = me->GetPositionX() + distOffset * std::cos(angle); + float y = me->GetPositionY() + distOffset * std::sin(angle); + + /// @todo: correct speed + me->GetMotionMaster()->MovePoint(0, x, y, me->GetPositionZ()); + break; + } + case EVENT_DESPAWN: + DoCast(me, SPELL_FLAME_SPHERE_DEATH_EFFECT, true); + me->DespawnOrUnsummon(1000); + break; + default: + break; + } + } } private: - uint32 _despawnTimer; + EventMap _events; + uint64 _flameSphereTargetGUID; }; CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new npc_taldaram_flamesphereAI(creature); + return new npc_prince_taldaram_flame_sphereAI(creature); } }; -class prince_taldaram_sphere : public GameObjectScript +// 193093, 193094 - Ancient Nerubian Device +class go_prince_taldaram_sphere : public GameObjectScript { public: - prince_taldaram_sphere() : GameObjectScript("prince_taldaram_sphere") { } + go_prince_taldaram_sphere() : GameObjectScript("go_prince_taldaram_sphere") { } bool OnGossipHello(Player* /*player*/, GameObject* go) OVERRIDE { @@ -369,7 +382,6 @@ class prince_taldaram_sphere : public GameObjectScript Creature* PrinceTaldaram = ObjectAccessor::GetCreature(*go, instance->GetData64(DATA_PRINCE_TALDARAM)); if (PrinceTaldaram && PrinceTaldaram->IsAlive()) { - // maybe these are hacks :( go->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE); go->SetGoState(GO_STATE_ACTIVE); @@ -385,15 +397,88 @@ class prince_taldaram_sphere : public GameObjectScript break; } - CAST_AI(boss_taldaram::boss_taldaramAI, PrinceTaldaram->AI())->CheckSpheres(); + CAST_AI(boss_prince_taldaram::boss_prince_taldaramAI, PrinceTaldaram->AI())->CheckSpheres(); } return true; } }; +// 55931 - Conjure Flame Sphere +class spell_prince_taldaram_conjure_flame_sphere : public SpellScriptLoader +{ + public: + spell_prince_taldaram_conjure_flame_sphere() : SpellScriptLoader("spell_prince_taldaram_conjure_flame_sphere") { } + + class spell_prince_taldaram_conjure_flame_sphere_SpellScript : public SpellScript + { + PrepareSpellScript(spell_prince_taldaram_conjure_flame_sphere_SpellScript); + + bool Validate(SpellInfo const* /*spellInfo*/) OVERRIDE + { + if (!sSpellMgr->GetSpellInfo(SPELL_FLAME_SPHERE_SUMMON_1) + || !sSpellMgr->GetSpellInfo(SPELL_FLAME_SPHERE_SUMMON_2) + || !sSpellMgr->GetSpellInfo(SPELL_FLAME_SPHERE_SUMMON_3)) + return false; + return true; + } + + void HandleScript(SpellEffIndex /*effIndex*/) + { + Unit* caster = GetCaster(); + caster->CastSpell(caster, SPELL_FLAME_SPHERE_SUMMON_1, true); + + if (caster->GetMap()->IsHeroic()) + { + caster->CastSpell(caster, SPELL_FLAME_SPHERE_SUMMON_2, true); + caster->CastSpell(caster, SPELL_FLAME_SPHERE_SUMMON_3, true); + } + } + + void Register() OVERRIDE + { + OnEffectHitTarget += SpellEffectFn(spell_prince_taldaram_conjure_flame_sphere_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_DUMMY); + } + }; + + SpellScript* GetSpellScript() const OVERRIDE + { + return new spell_prince_taldaram_conjure_flame_sphere_SpellScript(); + } +}; + +// 55895, 59511, 59512 - Flame Sphere Summon +class spell_prince_taldaram_flame_sphere_summon : public SpellScriptLoader +{ + public: + spell_prince_taldaram_flame_sphere_summon() : SpellScriptLoader("spell_prince_taldaram_flame_sphere_summon") { } + + class spell_prince_taldaram_flame_sphere_summon_SpellScript : public SpellScript + { + PrepareSpellScript(spell_prince_taldaram_flame_sphere_summon_SpellScript); + + void SetDest(SpellDestination& dest) + { + Position offset = { 0.0f, 0.0f, 5.5f, 0.0f }; + dest.RelocateOffset(offset); + } + + void Register() OVERRIDE + { + OnDestinationTargetSelect += SpellDestinationTargetSelectFn(spell_prince_taldaram_flame_sphere_summon_SpellScript::SetDest, EFFECT_0, TARGET_DEST_CASTER); + } + }; + + SpellScript* GetSpellScript() const OVERRIDE + { + return new spell_prince_taldaram_flame_sphere_summon_SpellScript(); + } +}; + void AddSC_boss_taldaram() { - new boss_taldaram(); - new npc_taldaram_flamesphere(); - new prince_taldaram_sphere(); + new boss_prince_taldaram(); + new npc_prince_taldaram_flame_sphere(); + new go_prince_taldaram_sphere(); + new spell_prince_taldaram_conjure_flame_sphere(); + new spell_prince_taldaram_flame_sphere_summon(); } diff --git a/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/boss_hadronox.cpp b/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/boss_hadronox.cpp index 7534e747ee0..a7ad7dbfb4b 100644 --- a/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/boss_hadronox.cpp +++ b/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/boss_hadronox.cpp @@ -84,7 +84,7 @@ public: uiDoorsTimer = urand(20*IN_MILLISECONDS, 30*IN_MILLISECONDS); uiCheckDistanceTimer = 2*IN_MILLISECONDS; - if (instance && (instance->GetBossState(DATA_HADRONOX) != DONE && !bFirstTime)) + if (instance->GetBossState(DATA_HADRONOX) != DONE && !bFirstTime) instance->SetBossState(DATA_HADRONOX, FAIL); bFirstTime = false; diff --git a/src/server/scripts/Northrend/ChamberOfAspects/ObsidianSanctum/boss_sartharion.cpp b/src/server/scripts/Northrend/ChamberOfAspects/ObsidianSanctum/boss_sartharion.cpp index 0b50375b809..045564ce570 100644 --- a/src/server/scripts/Northrend/ChamberOfAspects/ObsidianSanctum/boss_sartharion.cpp +++ b/src/server/scripts/Northrend/ChamberOfAspects/ObsidianSanctum/boss_sartharion.cpp @@ -467,7 +467,7 @@ public: CallDragon(DATA_TENEBRON); break; case EVENT_CALL_SHADRON: - CallDragon(DATA_SHADRON); + CallDragon(DATA_SHADRON); break; case EVENT_CALL_VESPERON: CallDragon(DATA_VESPERON); diff --git a/src/server/scripts/Northrend/ChamberOfAspects/ObsidianSanctum/obsidian_sanctum.cpp b/src/server/scripts/Northrend/ChamberOfAspects/ObsidianSanctum/obsidian_sanctum.cpp index dd699911786..9ae6f811e19 100644 --- a/src/server/scripts/Northrend/ChamberOfAspects/ObsidianSanctum/obsidian_sanctum.cpp +++ b/src/server/scripts/Northrend/ChamberOfAspects/ObsidianSanctum/obsidian_sanctum.cpp @@ -253,7 +253,7 @@ struct dummy_dragonAI : public ScriptedAI { case NPC_TENEBRON: { - if (instance && !instance->GetBossState(DATA_SARTHARION) == IN_PROGRESS) + if (!instance->GetBossState(DATA_SARTHARION) == IN_PROGRESS) { for (uint32 i = 0; i < 6; ++i) me->SummonCreature(NPC_TWILIGHT_EGG, TwilightEggs[i], TEMPSUMMON_CORPSE_TIMED_DESPAWN, 20000); @@ -267,7 +267,7 @@ struct dummy_dragonAI : public ScriptedAI } case NPC_SHADRON: { - if (instance && !instance->GetBossState(DATA_SARTHARION) == IN_PROGRESS) + if (!instance->GetBossState(DATA_SARTHARION) == IN_PROGRESS) me->SummonCreature(NPC_ACOLYTE_OF_SHADRON, AcolyteofShadron, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 28000); else me->SummonCreature(NPC_ACOLYTE_OF_SHADRON, AcolyteofShadron2, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 28000); @@ -276,7 +276,7 @@ struct dummy_dragonAI : public ScriptedAI } case NPC_VESPERON: { - if (instance && !instance->GetBossState(DATA_SARTHARION) == IN_PROGRESS) + if (!instance->GetBossState(DATA_SARTHARION) == IN_PROGRESS) { if (Creature* acolyte = me->SummonCreature(NPC_ACOLYTE_OF_VESPERON, AcolyteofVesperon, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 20000)) { @@ -328,19 +328,19 @@ struct dummy_dragonAI : public ScriptedAI { case NPC_TENEBRON: spellId = SPELL_POWER_OF_TENEBRON; - if (instance && instance->GetBossState(DATA_SARTHARION) != IN_PROGRESS) + if (instance->GetBossState(DATA_SARTHARION) != IN_PROGRESS) instance->SetBossState(DATA_TENEBRON, DONE); break; case NPC_SHADRON: spellId = SPELL_POWER_OF_SHADRON; - if (instance && instance->GetBossState(DATA_SARTHARION) != IN_PROGRESS) + if (instance->GetBossState(DATA_SARTHARION) != IN_PROGRESS) instance->SetBossState(DATA_SHADRON, DONE); if (Creature* acolyte = me->FindNearestCreature(NPC_ACOLYTE_OF_SHADRON, 100.0f)) acolyte->Kill(acolyte); break; case NPC_VESPERON: spellId = SPELL_POWER_OF_VESPERON; - if (instance && instance->GetBossState(DATA_SARTHARION) != IN_PROGRESS) + if (instance->GetBossState(DATA_SARTHARION) != IN_PROGRESS) instance->SetBossState(DATA_VESPERON, DONE); if (Creature* acolyte = me->FindNearestCreature(NPC_ACOLYTE_OF_VESPERON, 100.0f)) acolyte->Kill(acolyte); diff --git a/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_baltharus_the_warborn.cpp b/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_baltharus_the_warborn.cpp index 91c1563b494..6c0acc9bba4 100644 --- a/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_baltharus_the_warborn.cpp +++ b/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_baltharus_the_warborn.cpp @@ -252,9 +252,8 @@ class npc_baltharus_the_warborn_clone : public CreatureScript void JustDied(Unit* killer) OVERRIDE { // This is here because DamageTaken wont trigger if the damage is deadly. - if (_instance) - if (Creature* baltharus = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_BALTHARUS_THE_WARBORN))) - killer->Kill(baltharus); + if (Creature* baltharus = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_BALTHARUS_THE_WARBORN))) + killer->Kill(baltharus); } void UpdateAI(uint32 diff) OVERRIDE @@ -262,8 +261,7 @@ class npc_baltharus_the_warborn_clone : public CreatureScript if (!UpdateVictim()) return; - if (_instance) - me->SetHealth(_instance->GetData(DATA_BALTHARUS_SHARED_HEALTH)); + me->SetHealth(_instance->GetData(DATA_BALTHARUS_SHARED_HEALTH)); _events.Update(diff); diff --git a/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_halion.cpp b/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_halion.cpp index 0f583d54a13..c35c9ba2d11 100644 --- a/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_halion.cpp +++ b/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_halion.cpp @@ -1697,6 +1697,7 @@ class spell_halion_twilight_phasing : public SpellScriptLoader } }; +// 74805 - Summon Exit Portals class spell_halion_summon_exit_portals : public SpellScriptLoader { public: @@ -1706,23 +1707,22 @@ class spell_halion_summon_exit_portals : public SpellScriptLoader { PrepareSpellScript(spell_halion_summon_exit_portals_SpellScript); - void OnSummon(SpellEffIndex effIndex) + void SetDest0(SpellDestination& dest) { - WorldLocation summonPos = *GetExplTargetDest(); - Position offset = {0.0f, 20.0f, 0.0f, 0.0f}; - if (effIndex == EFFECT_1) - offset.m_positionY = -20.0f; - - summonPos.RelocateOffset(offset); + Position const offset = { 0.0f, 20.0f, 0.0f, 0.0f }; + dest.RelocateOffset(offset); + } - SetExplTargetDest(summonPos); - GetHitDest()->RelocateOffset(offset); + void SetDest1(SpellDestination& dest) + { + Position const offset = { 0.0f, -20.0f, 0.0f, 0.0f }; + dest.RelocateOffset(offset); } void Register() OVERRIDE { - OnEffectLaunch += SpellEffectFn(spell_halion_summon_exit_portals_SpellScript::OnSummon, EFFECT_0, SPELL_EFFECT_SUMMON_OBJECT_WILD); - OnEffectLaunch += SpellEffectFn(spell_halion_summon_exit_portals_SpellScript::OnSummon, EFFECT_1, SPELL_EFFECT_SUMMON_OBJECT_WILD); + OnDestinationTargetSelect += SpellDestinationTargetSelectFn(spell_halion_summon_exit_portals_SpellScript::SetDest0, EFFECT_0, TARGET_DEST_CASTER); + OnDestinationTargetSelect += SpellDestinationTargetSelectFn(spell_halion_summon_exit_portals_SpellScript::SetDest1, EFFECT_1, TARGET_DEST_CASTER); } }; diff --git a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/boss_grand_champions.cpp b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/boss_grand_champions.cpp index 3b1b5d4fd24..d2f6b8a3420 100644 --- a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/boss_grand_champions.cpp +++ b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/boss_grand_champions.cpp @@ -363,11 +363,11 @@ public: { bDone = true; - if (instance && me->GetGUID() == instance->GetData64(DATA_GRAND_CHAMPION_1)) + if (me->GetGUID() == instance->GetData64(DATA_GRAND_CHAMPION_1)) me->SetHomePosition(739.678f, 662.541f, 412.393f, 4.49f); - else if (instance && me->GetGUID() == instance->GetData64(DATA_GRAND_CHAMPION_2)) + else if (me->GetGUID() == instance->GetData64(DATA_GRAND_CHAMPION_2)) me->SetHomePosition(746.71f, 661.02f, 411.69f, 4.6f); - else if (instance && me->GetGUID() == instance->GetData64(DATA_GRAND_CHAMPION_3)) + else if (me->GetGUID() == instance->GetData64(DATA_GRAND_CHAMPION_3)) me->SetHomePosition(754.34f, 660.70f, 412.39f, 4.79f); EnterEvadeMode(); @@ -496,11 +496,11 @@ public: { bDone = true; - if (instance && me->GetGUID() == instance->GetData64(DATA_GRAND_CHAMPION_1)) + if (me->GetGUID() == instance->GetData64(DATA_GRAND_CHAMPION_1)) me->SetHomePosition(739.678f, 662.541f, 412.393f, 4.49f); - else if (instance && me->GetGUID() == instance->GetData64(DATA_GRAND_CHAMPION_2)) + else if (me->GetGUID() == instance->GetData64(DATA_GRAND_CHAMPION_2)) me->SetHomePosition(746.71f, 661.02f, 411.69f, 4.6f); - else if (instance && me->GetGUID() == instance->GetData64(DATA_GRAND_CHAMPION_3)) + else if (me->GetGUID() == instance->GetData64(DATA_GRAND_CHAMPION_3)) me->SetHomePosition(754.34f, 660.70f, 412.39f, 4.79f); instance->SetData(BOSS_GRAND_CHAMPIONS, IN_PROGRESS); @@ -639,11 +639,11 @@ public: { bDone = true; - if (instance && me->GetGUID() == instance->GetData64(DATA_GRAND_CHAMPION_1)) + if (me->GetGUID() == instance->GetData64(DATA_GRAND_CHAMPION_1)) me->SetHomePosition(739.678f, 662.541f, 412.393f, 4.49f); - else if (instance && me->GetGUID() == instance->GetData64(DATA_GRAND_CHAMPION_2)) + else if (me->GetGUID() == instance->GetData64(DATA_GRAND_CHAMPION_2)) me->SetHomePosition(746.71f, 661.02f, 411.69f, 4.6f); - else if (instance && me->GetGUID() == instance->GetData64(DATA_GRAND_CHAMPION_3)) + else if (me->GetGUID() == instance->GetData64(DATA_GRAND_CHAMPION_3)) me->SetHomePosition(754.34f, 660.70f, 412.39f, 4.79f); instance->SetData(BOSS_GRAND_CHAMPIONS, IN_PROGRESS); @@ -783,11 +783,11 @@ public: { bDone = true; - if (instance && me->GetGUID() == instance->GetData64(DATA_GRAND_CHAMPION_1)) + if (me->GetGUID() == instance->GetData64(DATA_GRAND_CHAMPION_1)) me->SetHomePosition(739.678f, 662.541f, 412.393f, 4.49f); - else if (instance && me->GetGUID() == instance->GetData64(DATA_GRAND_CHAMPION_2)) + else if (me->GetGUID() == instance->GetData64(DATA_GRAND_CHAMPION_2)) me->SetHomePosition(746.71f, 661.02f, 411.69f, 4.6f); - else if (instance && me->GetGUID() == instance->GetData64(DATA_GRAND_CHAMPION_3)) + else if (me->GetGUID() == instance->GetData64(DATA_GRAND_CHAMPION_3)) me->SetHomePosition(754.34f, 660.70f, 412.39f, 4.79f); instance->SetData(BOSS_GRAND_CHAMPIONS, IN_PROGRESS); @@ -929,11 +929,11 @@ public: { bDone = true; - if (instance && me->GetGUID() == instance->GetData64(DATA_GRAND_CHAMPION_1)) + if (me->GetGUID() == instance->GetData64(DATA_GRAND_CHAMPION_1)) me->SetHomePosition(739.678f, 662.541f, 412.393f, 4.49f); - else if (instance && me->GetGUID() == instance->GetData64(DATA_GRAND_CHAMPION_2)) + else if (me->GetGUID() == instance->GetData64(DATA_GRAND_CHAMPION_2)) me->SetHomePosition(746.71f, 661.02f, 411.69f, 4.6f); - else if (instance && me->GetGUID() == instance->GetData64(DATA_GRAND_CHAMPION_3)) + else if (me->GetGUID() == instance->GetData64(DATA_GRAND_CHAMPION_3)) me->SetHomePosition(754.34f, 660.70f, 412.39f, 4.79f); instance->SetData(BOSS_GRAND_CHAMPIONS, IN_PROGRESS); diff --git a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/trial_of_the_champion.cpp b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/trial_of_the_champion.cpp index ab21393fce3..a60e69d6479 100644 --- a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/trial_of_the_champion.cpp +++ b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/trial_of_the_champion.cpp @@ -431,7 +431,7 @@ public: void JustSummoned(Creature* summon) OVERRIDE { - if (instance && instance->GetData(BOSS_GRAND_CHAMPIONS) == NOT_STARTED) + if (instance->GetData(BOSS_GRAND_CHAMPIONS) == NOT_STARTED) { summon->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); summon->SetReactState(REACT_PASSIVE); diff --git a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_anubarak_trial.cpp b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_anubarak_trial.cpp index 0b9b9f2543f..93d5c399725 100644 --- a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_anubarak_trial.cpp +++ b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_anubarak_trial.cpp @@ -470,7 +470,7 @@ class npc_swarm_scarab : public CreatureScript void UpdateAI(uint32 diff) OVERRIDE { - if (_instance && _instance->GetBossState(BOSS_ANUBARAK) != IN_PROGRESS) + if (_instance->GetBossState(BOSS_ANUBARAK) != IN_PROGRESS) me->DisappearAndDie(); if (!UpdateVictim()) @@ -540,7 +540,7 @@ class npc_nerubian_burrower : public CreatureScript void UpdateAI(uint32 diff) OVERRIDE { - if (_instance && _instance->GetBossState(BOSS_ANUBARAK) != IN_PROGRESS) + if (_instance->GetBossState(BOSS_ANUBARAK) != IN_PROGRESS) me->DisappearAndDie(); if (!UpdateVictim() && !me->HasAura(SPELL_SUBMERGE_EFFECT)) diff --git a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_lord_jaraxxus.cpp b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_lord_jaraxxus.cpp index 99423a4b7ae..cb4b3cfcea3 100644 --- a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_lord_jaraxxus.cpp +++ b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_lord_jaraxxus.cpp @@ -239,7 +239,7 @@ class npc_legion_flame : public CreatureScript void UpdateAI(uint32 /*diff*/) OVERRIDE { UpdateVictim(); - if (_instance && _instance->GetBossState(BOSS_JARAXXUS) != IN_PROGRESS) + if (_instance->GetBossState(BOSS_JARAXXUS) != IN_PROGRESS) me->DespawnOrUnsummon(); } private: @@ -326,7 +326,7 @@ class npc_fel_infernal : public CreatureScript void UpdateAI(uint32 diff) OVERRIDE { - if (_instance && _instance->GetBossState(BOSS_JARAXXUS) != IN_PROGRESS) + if (_instance->GetBossState(BOSS_JARAXXUS) != IN_PROGRESS) { me->DespawnOrUnsummon(); return; @@ -420,8 +420,7 @@ class npc_mistress_of_pain : public CreatureScript npc_mistress_of_painAI(Creature* creature) : ScriptedAI(creature) { _instance = creature->GetInstanceScript(); - if (_instance) - _instance->SetData(DATA_MISTRESS_OF_PAIN_COUNT, INCREASE); + _instance->SetData(DATA_MISTRESS_OF_PAIN_COUNT, INCREASE); } void Reset() OVERRIDE @@ -435,13 +434,12 @@ class npc_mistress_of_pain : public CreatureScript void JustDied(Unit* /*killer*/) OVERRIDE { - if (_instance) - _instance->SetData(DATA_MISTRESS_OF_PAIN_COUNT, DECREASE); + _instance->SetData(DATA_MISTRESS_OF_PAIN_COUNT, DECREASE); } void UpdateAI(uint32 diff) OVERRIDE { - if (_instance && _instance->GetBossState(BOSS_JARAXXUS) != IN_PROGRESS) + if (_instance->GetBossState(BOSS_JARAXXUS) != IN_PROGRESS) { me->DespawnOrUnsummon(); return; diff --git a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_northrend_beasts.cpp b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_northrend_beasts.cpp index a11a74250f5..ea166585bb3 100644 --- a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_northrend_beasts.cpp +++ b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_northrend_beasts.cpp @@ -295,8 +295,7 @@ class npc_snobold_vassal : public CreatureScript npc_snobold_vassalAI(Creature* creature) : ScriptedAI(creature) { _instance = creature->GetInstanceScript(); - if (_instance) - _instance->SetData(DATA_SNOBOLD_COUNT, INCREASE); + _instance->SetData(DATA_SNOBOLD_COUNT, INCREASE); } void Reset() OVERRIDE @@ -350,8 +349,7 @@ class npc_snobold_vassal : public CreatureScript if (Unit* target = ObjectAccessor::GetPlayer(*me, _targetGUID)) if (target->IsAlive()) target->RemoveAurasDueToSpell(SPELL_SNOBOLLED); - if (_instance) - _instance->SetData(DATA_SNOBOLD_COUNT, DECREASE); + _instance->SetData(DATA_SNOBOLD_COUNT, DECREASE); } void DoAction(int32 action) OVERRIDE @@ -378,30 +376,27 @@ class npc_snobold_vassal : public CreatureScript { if (!target->IsAlive()) { - if (_instance) + Unit* gormok = ObjectAccessor::GetCreature(*me, _instance->GetData64(NPC_GORMOK)); + if (gormok && gormok->IsAlive()) { - Unit* gormok = ObjectAccessor::GetCreature(*me, _instance->GetData64(NPC_GORMOK)); - if (gormok && gormok->IsAlive()) - { - SetCombatMovement(false); - _targetDied = true; + SetCombatMovement(false); + _targetDied = true; - // looping through Gormoks seats - for (uint8 i = 0; i < MAX_SNOBOLDS; i++) + // looping through Gormoks seats + for (uint8 i = 0; i < MAX_SNOBOLDS; i++) + { + if (!gormok->GetVehicleKit()->GetPassenger(i)) { - if (!gormok->GetVehicleKit()->GetPassenger(i)) - { - me->EnterVehicle(gormok, i); - DoAction(ACTION_ENABLE_FIRE_BOMB); - break; - } + me->EnterVehicle(gormok, i); + DoAction(ACTION_ENABLE_FIRE_BOMB); + break; } } - else if (Unit* target2 = SelectTarget(SELECT_TARGET_RANDOM, 0, 0.0f, true)) - { - _targetGUID = target2->GetGUID(); - me->GetMotionMaster()->MoveJump(target2->GetPositionX(), target2->GetPositionY(), target2->GetPositionZ(), 15.0f, 15.0f); - } + } + else if (Unit* target2 = SelectTarget(SELECT_TARGET_RANDOM, 0, 0.0f, true)) + { + _targetGUID = target2->GetGUID(); + me->GetMotionMaster()->MoveJump(target2->GetPositionX(), target2->GetPositionY(), target2->GetPositionZ(), 15.0f, 15.0f); } } } @@ -528,7 +523,7 @@ struct boss_jormungarAI : public BossAI void JustReachedHome() OVERRIDE { // prevent losing 2 attempts at once on heroics - if (instance && instance->GetData(TYPE_NORTHREND_BEASTS) != FAIL) + if (instance->GetData(TYPE_NORTHREND_BEASTS) != FAIL) instance->SetData(TYPE_NORTHREND_BEASTS, FAIL); me->DespawnOrUnsummon(); @@ -552,7 +547,7 @@ struct boss_jormungarAI : public BossAI if (!UpdateVictim()) return; - if (!Enraged && instance && instance->GetData(TYPE_NORTHREND_BEASTS) == SNAKES_SPECIAL) + if (!Enraged && instance->GetData(TYPE_NORTHREND_BEASTS) == SNAKES_SPECIAL) { me->RemoveAurasDueToSpell(SPELL_SUBMERGE_0); me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_NOT_SELECTABLE); diff --git a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_twin_valkyr.cpp b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_twin_valkyr.cpp index d0120e4c2de..0d7dc9062ad 100644 --- a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_twin_valkyr.cpp +++ b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_twin_valkyr.cpp @@ -281,7 +281,6 @@ struct boss_twin_baseAI : public BossAI { SetEquipmentSlots(false, Weapon, mode ? Weapon : int32(EQUIP_UNEQUIP), EQUIP_UNEQUIP); me->SetCanDualWield(mode); - me->UpdateDamagePhysical(mode ? OFF_ATTACK : BASE_ATTACK); } void UpdateAI(uint32 diff) OVERRIDE diff --git a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/trial_of_the_crusader.cpp b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/trial_of_the_crusader.cpp index cb0ec2acc38..fdefde10b4f 100644 --- a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/trial_of_the_crusader.cpp +++ b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/trial_of_the_crusader.cpp @@ -247,8 +247,8 @@ class boss_lich_king_toc : public CreatureScript summoned->CastSpell(summoned, 51807, false); summoned->SetDisplayId(summoned->GetCreatureTemplate()->Modelid2); } - if (_instance) - _instance->SetBossState(BOSS_LICH_KING, IN_PROGRESS); + + _instance->SetBossState(BOSS_LICH_KING, IN_PROGRESS); me->SetWalk(true); } @@ -401,12 +401,9 @@ class npc_fizzlebang_toc : public CreatureScript { case 1: me->SetWalk(false); - if (_instance) - { - _instance->DoUseDoorOrButton(_instance->GetData64(GO_MAIN_GATE_DOOR)); - _instance->SetData(TYPE_EVENT, 1120); - _instance->SetData(TYPE_EVENT_TIMER, 1*IN_MILLISECONDS); - } + _instance->DoUseDoorOrButton(_instance->GetData64(GO_MAIN_GATE_DOOR)); + _instance->SetData(TYPE_EVENT, 1120); + _instance->SetData(TYPE_EVENT_TIMER, 1*IN_MILLISECONDS); break; default: break; diff --git a/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/halls_of_reflection.cpp b/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/halls_of_reflection.cpp index c9247ce17f3..027a6843c87 100644 --- a/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/halls_of_reflection.cpp +++ b/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/halls_of_reflection.cpp @@ -664,8 +664,7 @@ class npc_jaina_or_sylvanas_hor : public CreatureScript _events.ScheduleEvent(EVENT_INTRO_END, 5000); break; case EVENT_INTRO_END: - if (_instance) - _instance->SetData(DATA_INTRO_EVENT, DONE); + _instance->SetData(DATA_INTRO_EVENT, DONE); // Loralen or Koreln disappearAndDie() if (Creature* lichking = ObjectAccessor::GetCreature(*me, _lichkingGUID)) { @@ -1830,7 +1829,7 @@ public: _emergeTimer = 4000; _doEmerge = false; _doJump = false; - if (_instance && _instance->GetData(DATA_ESCAPE_EVENT) == IN_PROGRESS) + if (_instance->GetData(DATA_ESCAPE_EVENT) == IN_PROGRESS) _instance->SetData(DATA_SUMMONS, 1); } @@ -1843,8 +1842,7 @@ public: void JustDied(Unit* /*killer*/) OVERRIDE { - if (_instance) - _instance->SetData(DATA_SUMMONS, 0); + _instance->SetData(DATA_SUMMONS, 0); } void AttackStart(Unit* who) OVERRIDE @@ -1932,9 +1930,8 @@ public: _boltVolleyTimer = 15000; _curseTimer = 7000; _doEmerge = false; - if (_instance) - if (_instance->GetData(DATA_ESCAPE_EVENT) == IN_PROGRESS) - _instance->SetData(DATA_SUMMONS, 1); + if (_instance->GetData(DATA_ESCAPE_EVENT) == IN_PROGRESS) + _instance->SetData(DATA_SUMMONS, 1); } void IsSummonedBy(Unit*) OVERRIDE @@ -1945,9 +1942,7 @@ public: void JustDied(Unit* /*killer*/) OVERRIDE { - if (_instance) - _instance->SetData(DATA_SUMMONS, 0); - + _instance->SetData(DATA_SUMMONS, 0); } void AttackStart(Unit* who) OVERRIDE @@ -2049,9 +2044,8 @@ public: _doWalk = false; _vomitTimer = 15000; _strikeTimer = 6000; - if (_instance) - if (_instance->GetData(DATA_ESCAPE_EVENT) == IN_PROGRESS) - _instance->SetData(DATA_SUMMONS, 1); + if (_instance->GetData(DATA_ESCAPE_EVENT) == IN_PROGRESS) + _instance->SetData(DATA_SUMMONS, 1); } void IsSummonedBy(Unit*) OVERRIDE @@ -2062,9 +2056,6 @@ public: void UpdateAI(uint32 diff) OVERRIDE { - if (!_instance) - return; - if (_instance->GetData(DATA_ESCAPE_EVENT) == IN_PROGRESS) { if (_doWalk != true) @@ -2103,8 +2094,7 @@ public: void JustDied(Unit* /*killer*/) OVERRIDE { - if (_instance) - _instance->SetData(DATA_SUMMONS, 0); + _instance->SetData(DATA_SUMMONS, 0); } }; diff --git a/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/halls_of_reflection.h b/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/halls_of_reflection.h index ff3192b89d5..c4776c3cfcd 100644 --- a/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/halls_of_reflection.h +++ b/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/halls_of_reflection.h @@ -147,9 +147,9 @@ struct boss_horAI : ScriptedAI { events.Reset(); me->SetVisible(false); - me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC|UNIT_FLAG_IMMUNE_TO_NPC); + me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC | UNIT_FLAG_IMMUNE_TO_NPC); me->SetReactState(REACT_PASSIVE); - if (instance && instance->GetData(DATA_WAVE_COUNT) != NOT_STARTED) + if (instance->GetData(DATA_WAVE_COUNT) != NOT_STARTED) instance->ProcessEvent(0, EVENT_DO_WIPE); } @@ -158,7 +158,7 @@ struct boss_horAI : ScriptedAI switch (actionID) { case ACTION_ENTER_COMBAT: // called by InstanceScript when boss shall enter in combat. - me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC|UNIT_FLAG_IMMUNE_TO_NPC); + me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC | UNIT_FLAG_IMMUNE_TO_NPC); me->SetReactState(REACT_AGGRESSIVE); if (Unit* unit = me->SelectNearestTarget()) diff --git a/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/boss_forgemaster_garfrost.cpp b/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/boss_forgemaster_garfrost.cpp index 0859d43ee85..fe2b818b325 100644 --- a/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/boss_forgemaster_garfrost.cpp +++ b/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/boss_forgemaster_garfrost.cpp @@ -111,12 +111,13 @@ class boss_garfrost : public CreatureScript { _JustDied(); Talk(SAY_DEATH); + me->RemoveAllGameObjects(); if (Creature* tyrannus = me->GetCreature(*me, instance->GetData64(DATA_TYRANNUS))) tyrannus->AI()->Talk(SAY_TYRANNUS_DEATH); } - void DamageTaken(Unit* /*attacker*/, uint32& /*uiDamage*/) OVERRIDE + void DamageTaken(Unit* /*attacker*/, uint32& /*damage*/) OVERRIDE { if (events.IsInPhase(PHASE_ONE) && !HealthAbovePct(66)) { diff --git a/src/server/scripts/Northrend/Gundrak/boss_drakkari_colossus.cpp b/src/server/scripts/Northrend/Gundrak/boss_drakkari_colossus.cpp index 5a16271d378..46912eeb898 100644 --- a/src/server/scripts/Northrend/Gundrak/boss_drakkari_colossus.cpp +++ b/src/server/scripts/Northrend/Gundrak/boss_drakkari_colossus.cpp @@ -423,7 +423,7 @@ public: if (id == 1) { - if (Creature* colossus = Unit::GetCreature(*me, instance ? instance->GetData64(DATA_DRAKKARI_COLOSSUS) : 0)) + if (Creature* colossus = Unit::GetCreature(*me, instance->GetData64(DATA_DRAKKARI_COLOSSUS))) { colossus->AI()->DoAction(ACTION_UNFREEZE_COLOSSUS); if (!colossus->AI()->GetData(DATA_INTRO_DONE)) @@ -440,7 +440,7 @@ public: return; // we do this checks to see if the creature is one of the creatures that sorround the boss - if (Creature* colossus = Unit::GetCreature(*me, instance ? instance->GetData64(DATA_DRAKKARI_COLOSSUS) : 0)) + if (Creature* colossus = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_DRAKKARI_COLOSSUS))) { Position homePosition; me->GetHomePosition().GetPosition(&homePosition); diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_blood_prince_council.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_blood_prince_council.cpp index 30c11ec556d..b053f0a0258 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/boss_blood_prince_council.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_blood_prince_council.cpp @@ -1492,6 +1492,7 @@ class spell_taldaram_ball_of_inferno_flame : public SpellScriptLoader } }; +// 72080 - Kinetic Bomb (Valanar) class spell_valanar_kinetic_bomb : public SpellScriptLoader { public: @@ -1501,18 +1502,15 @@ class spell_valanar_kinetic_bomb : public SpellScriptLoader { PrepareSpellScript(spell_valanar_kinetic_bomb_SpellScript); - void ChangeSummonPos(SpellEffIndex /*effIndex*/) + void SetDest(SpellDestination& dest) { - WorldLocation summonPos = *GetExplTargetDest(); - Position offset = {0.0f, 0.0f, 20.0f, 0.0f}; - summonPos.RelocateOffset(offset); - SetExplTargetDest(summonPos); - GetHitDest()->RelocateOffset(offset); + Position const offset = { 0.0f, 0.0f, 20.0f, 0.0f }; + dest.RelocateOffset(offset); } void Register() OVERRIDE { - OnEffectHit += SpellEffectFn(spell_valanar_kinetic_bomb_SpellScript::ChangeSummonPos, EFFECT_0, SPELL_EFFECT_SUMMON); + OnDestinationTargetSelect += SpellDestinationTargetSelectFn(spell_valanar_kinetic_bomb_SpellScript::SetDest, EFFECT_0, TARGET_DEST_CASTER); } }; diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_deathbringer_saurfang.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_deathbringer_saurfang.cpp index 7be766c0a0e..791f6fa2b80 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/boss_deathbringer_saurfang.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_deathbringer_saurfang.cpp @@ -773,7 +773,7 @@ class npc_high_overlord_saurfang_icc : public CreatureScript bool OnGossipHello(Player* player, Creature* creature) OVERRIDE { InstanceScript* instance = creature->GetInstanceScript(); - if (instance && instance->GetBossState(DATA_DEATHBRINGER_SAURFANG) != DONE) + if (instance->GetBossState(DATA_DEATHBRINGER_SAURFANG) != DONE) { player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, "We are ready to go, High Overlord. The Lich King must fall!", 631, -ACTION_START_EVENT); player->SEND_GOSSIP_MENU(DEFAULT_GOSSIP_MESSAGE, creature->GetGUID()); @@ -921,7 +921,7 @@ class npc_muradin_bronzebeard_icc : public CreatureScript bool OnGossipHello(Player* player, Creature* creature) OVERRIDE { InstanceScript* instance = creature->GetInstanceScript(); - if (instance && instance->GetBossState(DATA_DEATHBRINGER_SAURFANG) != DONE) + if (instance->GetBossState(DATA_DEATHBRINGER_SAURFANG) != DONE) { player->ADD_GOSSIP_ITEM(0, "Let it begin...", 631, -ACTION_START_EVENT + 1); player->SEND_GOSSIP_MENU(DEFAULT_GOSSIP_MESSAGE, creature->GetGUID()); diff --git a/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.cpp b/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.cpp index f3b62cd7b24..ca2c75e502c 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.cpp @@ -2034,6 +2034,7 @@ class spell_svalna_remove_spear : public SpellScriptLoader } }; +// 72585 - Soul Missile class spell_icc_soul_missile : public SpellScriptLoader { public: @@ -2043,15 +2044,15 @@ class spell_icc_soul_missile : public SpellScriptLoader { PrepareSpellScript(spell_icc_soul_missile_SpellScript); - void RelocateDest() + void RelocateDest(SpellDestination& dest) { - static Position const offset = {0.0f, 0.0f, 200.0f, 0.0f}; - const_cast<WorldLocation*>(GetExplTargetDest())->RelocateOffset(offset); + static Position const offset = { 0.0f, 0.0f, 200.0f, 0.0f }; + dest.RelocateOffset(offset); } void Register() OVERRIDE { - OnCast += SpellCastFn(spell_icc_soul_missile_SpellScript::RelocateDest); + OnDestinationTargetSelect += SpellDestinationTargetSelectFn(spell_icc_soul_missile_SpellScript::RelocateDest, EFFECT_0, TARGET_DEST_CASTER); } }; diff --git a/src/server/scripts/Northrend/Naxxramas/boss_grobbulus.cpp b/src/server/scripts/Northrend/Naxxramas/boss_grobbulus.cpp index 3de5b6a7b2b..6769e3429fa 100644 --- a/src/server/scripts/Northrend/Naxxramas/boss_grobbulus.cpp +++ b/src/server/scripts/Northrend/Naxxramas/boss_grobbulus.cpp @@ -17,18 +17,19 @@ #include "ScriptMgr.h" #include "ScriptedCreature.h" +#include "SpellScript.h" +#include "SpellAuraEffects.h" #include "naxxramas.h" -#include "SpellInfo.h" enum Spells { SPELL_BOMBARD_SLIME = 28280, - SPELL_POISON_CLOUD = 28240, - SPELL_MUTATING_INJECTION = 28169, SPELL_SLIME_SPRAY = 28157, - H_SPELL_SLIME_SPRAY = 54364, - SPELL_BERSERK = 26662, - SPELL_POISON_CLOUD_ADD = 59116 + SPELL_MUTATING_INJECTION = 28169, + SPELL_MUTATING_EXPLOSION = 28206, + SPELL_POISON_CLOUD = 28240, + SPELL_POISON_CLOUD_PASSIVE = 28158, + SPELL_BERSERK = 26662 }; enum Events @@ -46,115 +47,183 @@ enum CreatureId class boss_grobbulus : public CreatureScript { -public: - boss_grobbulus() : CreatureScript("boss_grobbulus") { } + public: + boss_grobbulus() : CreatureScript("boss_grobbulus") { } - CreatureAI* GetAI(Creature* creature) const OVERRIDE - { - return new boss_grobbulusAI(creature); - } - - struct boss_grobbulusAI : public BossAI - { - boss_grobbulusAI(Creature* creature) : BossAI(creature, BOSS_GROBBULUS) + struct boss_grobbulusAI : public BossAI { - me->ApplySpellImmune(0, IMMUNITY_ID, SPELL_POISON_CLOUD_ADD, true); - } + boss_grobbulusAI(Creature* creature) : BossAI(creature, BOSS_GROBBULUS) { } - void EnterCombat(Unit* /*who*/) OVERRIDE - { - _EnterCombat(); - events.ScheduleEvent(EVENT_CLOUD, 15000); - events.ScheduleEvent(EVENT_INJECT, 20000); - events.ScheduleEvent(EVENT_SPRAY, 15000+rand()%15000); //not sure - events.ScheduleEvent(EVENT_BERSERK, 12*60000); - } + void EnterCombat(Unit* /*who*/) OVERRIDE + { + _EnterCombat(); + events.ScheduleEvent(EVENT_CLOUD, 15000); + events.ScheduleEvent(EVENT_INJECT, 20000); + events.ScheduleEvent(EVENT_SPRAY, urand(15000, 30000)); // not sure + events.ScheduleEvent(EVENT_BERSERK, 12 * 60000); + } - void SpellHitTarget(Unit* target, const SpellInfo* spell) OVERRIDE - { - if (spell->Id == uint32(SPELL_SLIME_SPRAY)) + void SpellHitTarget(Unit* target, SpellInfo const* spell) OVERRIDE { - if (TempSummon* slime = me->SummonCreature(NPC_FALLOUT_SLIME, target->GetPositionX(), target->GetPositionY(), target->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 0)) - DoZoneInCombat(slime); + if (spell->Id == SPELL_SLIME_SPRAY) + me->SummonCreature(NPC_FALLOUT_SLIME, *target, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT); } - } - void UpdateAI(uint32 diff) OVERRIDE - { - if (!UpdateVictim()) - return; + void UpdateAI(uint32 diff) OVERRIDE + { + if (!UpdateVictim()) + return; - events.Update(diff); + events.Update(diff); - while (uint32 eventId = events.ExecuteEvent()) - { - switch (eventId) + while (uint32 eventId = events.ExecuteEvent()) { - case EVENT_CLOUD: - DoCastAOE(SPELL_POISON_CLOUD); - events.ScheduleEvent(EVENT_CLOUD, 15000); - return; - case EVENT_BERSERK: - DoCastAOE(SPELL_BERSERK); - return; - case EVENT_SPRAY: - DoCastAOE(SPELL_SLIME_SPRAY); - events.ScheduleEvent(EVENT_SPRAY, 15000+rand()%15000); - return; - case EVENT_INJECT: - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1)) - if (!target->HasAura(SPELL_MUTATING_INJECTION)) + switch (eventId) + { + case EVENT_CLOUD: + DoCastAOE(SPELL_POISON_CLOUD); + events.ScheduleEvent(EVENT_CLOUD, 15000); + return; + case EVENT_BERSERK: + DoCastAOE(SPELL_BERSERK, true); + return; + case EVENT_SPRAY: + DoCastAOE(SPELL_SLIME_SPRAY); + events.ScheduleEvent(EVENT_SPRAY, urand(15000, 30000)); + return; + case EVENT_INJECT: + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1, 0.0f, true, -SPELL_MUTATING_INJECTION)) DoCast(target, SPELL_MUTATING_INJECTION); - events.ScheduleEvent(EVENT_INJECT, 8000 + uint32(120 * me->GetHealthPct())); - return; + events.ScheduleEvent(EVENT_INJECT, 8000 + uint32(120 * me->GetHealthPct())); + return; + default: + break; + } } + + DoMeleeAttackIfReady(); } + }; - DoMeleeAttackIfReady(); + CreatureAI* GetAI(Creature* creature) const OVERRIDE + { + return new boss_grobbulusAI(creature); } - }; - }; class npc_grobbulus_poison_cloud : public CreatureScript { -public: - npc_grobbulus_poison_cloud() : CreatureScript("npc_grobbulus_poison_cloud") { } + public: + npc_grobbulus_poison_cloud() : CreatureScript("npc_grobbulus_poison_cloud") { } + + struct npc_grobbulus_poison_cloudAI : public ScriptedAI + { + npc_grobbulus_poison_cloudAI(Creature* creature) : ScriptedAI(creature) + { + SetCombatMovement(false); + creature->SetReactState(REACT_PASSIVE); + } + + void IsSummonedBy(Unit* /*summoner*/) OVERRIDE + { + // no visual when casting in ctor or Reset() + DoCast(me, SPELL_POISON_CLOUD_PASSIVE, true); + } - CreatureAI* GetAI(Creature* creature) const OVERRIDE - { - return new npc_grobbulus_poison_cloudAI(creature); - } + void UpdateAI(uint32 /*diff*/) OVERRIDE { } + }; - struct npc_grobbulus_poison_cloudAI : public ScriptedAI - { - npc_grobbulus_poison_cloudAI(Creature* creature) : ScriptedAI(creature) + CreatureAI* GetAI(Creature* creature) const OVERRIDE { - SetCombatMovement(false); + return new npc_grobbulus_poison_cloudAI(creature); } +}; + +// 28169 - Mutating Injection +class spell_grobbulus_mutating_injection : public SpellScriptLoader +{ + public: + spell_grobbulus_mutating_injection() : SpellScriptLoader("spell_grobbulus_mutating_injection") { } - uint32 Cloud_Timer; + class spell_grobbulus_mutating_injection_AuraScript : public AuraScript + { + PrepareAuraScript(spell_grobbulus_mutating_injection_AuraScript); + + bool Validate(SpellInfo const* /*spellInfo*/) OVERRIDE + { + if (!sSpellMgr->GetSpellInfo(SPELL_MUTATING_EXPLOSION) + || !sSpellMgr->GetSpellInfo(SPELL_POISON_CLOUD)) + return false; + return true; + } + + void HandleRemove(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/) + { + AuraRemoveMode removeMode = GetTargetApplication()->GetRemoveMode(); + if (removeMode != AURA_REMOVE_BY_ENEMY_SPELL && removeMode != AURA_REMOVE_BY_EXPIRE) + return; + + if (Unit* caster = GetCaster()) + { + caster->CastSpell(GetTarget(), SPELL_MUTATING_EXPLOSION, true); + GetTarget()->CastSpell(GetTarget(), SPELL_POISON_CLOUD, true, NULL, aurEff, GetCasterGUID()); + } + } - void Reset() OVERRIDE + void Register() OVERRIDE + { + AfterEffectRemove += AuraEffectRemoveFn(spell_grobbulus_mutating_injection_AuraScript::HandleRemove, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); + } + }; + + AuraScript* GetAuraScript() const OVERRIDE { - Cloud_Timer = 1000; - me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); + return new spell_grobbulus_mutating_injection_AuraScript(); } +}; - void UpdateAI(uint32 diff) OVERRIDE +// 28158, 54362 - Poison (Grobbulus) +class spell_grobbulus_poison_cloud : public SpellScriptLoader +{ + public: + spell_grobbulus_poison_cloud() : SpellScriptLoader("spell_grobbulus_poison_cloud") { } + + class spell_grobbulus_poison_cloud_AuraScript : public AuraScript { - if (Cloud_Timer <= diff) + PrepareAuraScript(spell_grobbulus_poison_cloud_AuraScript); + + bool Validate(SpellInfo const* spellInfo) OVERRIDE { - DoCast(me, SPELL_POISON_CLOUD_ADD); - Cloud_Timer = 10000; - } else Cloud_Timer -= diff; - } - }; + if (!sSpellMgr->GetSpellInfo(spellInfo->Effects[EFFECT_0].TriggerSpell)) + return false; + return true; + } + + void PeriodicTick(AuraEffect const* aurEff) + { + PreventDefaultAction(); + uint32 triggerSpell = GetSpellInfo()->Effects[aurEff->GetEffIndex()].TriggerSpell; + int32 mod = int32(((float(aurEff->GetTickNumber()) / aurEff->GetTotalTicks()) * 0.9f + 0.1f) * 10000 * 2 / 3); + GetTarget()->CastCustomSpell(triggerSpell, SPELLVALUE_RADIUS_MOD, mod, (Unit*)NULL, TRIGGERED_FULL_MASK, NULL, aurEff); + } + + void Register() OVERRIDE + { + OnEffectPeriodic += AuraEffectPeriodicFn(spell_grobbulus_poison_cloud_AuraScript::PeriodicTick, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL); + } + }; + + AuraScript* GetAuraScript() const OVERRIDE + { + return new spell_grobbulus_poison_cloud_AuraScript(); + } }; void AddSC_boss_grobbulus() { new boss_grobbulus(); new npc_grobbulus_poison_cloud(); + new spell_grobbulus_mutating_injection(); + new spell_grobbulus_poison_cloud(); } diff --git a/src/server/scripts/Northrend/Naxxramas/boss_kelthuzad.cpp b/src/server/scripts/Northrend/Naxxramas/boss_kelthuzad.cpp index 41d1f53b52d..2091b82e20c 100644 --- a/src/server/scripts/Northrend/Naxxramas/boss_kelthuzad.cpp +++ b/src/server/scripts/Northrend/Naxxramas/boss_kelthuzad.cpp @@ -374,11 +374,11 @@ public: void FindGameObjects() { - PortalsGUID[0] = instance ? instance->GetData64(DATA_KELTHUZAD_PORTAL01) : 0; - PortalsGUID[1] = instance ? instance->GetData64(DATA_KELTHUZAD_PORTAL02) : 0; - PortalsGUID[2] = instance ? instance->GetData64(DATA_KELTHUZAD_PORTAL03) : 0; - PortalsGUID[3] = instance ? instance->GetData64(DATA_KELTHUZAD_PORTAL04) : 0; - KTTriggerGUID = instance ? instance->GetData64(DATA_KELTHUZAD_TRIGGER) : 0; + PortalsGUID[0] = instance->GetData64(DATA_KELTHUZAD_PORTAL01); + PortalsGUID[1] = instance->GetData64(DATA_KELTHUZAD_PORTAL02); + PortalsGUID[2] = instance->GetData64(DATA_KELTHUZAD_PORTAL03); + PortalsGUID[3] = instance->GetData64(DATA_KELTHUZAD_PORTAL04); + KTTriggerGUID = instance->GetData64(DATA_KELTHUZAD_TRIGGER); } void UpdateAI(uint32 diff) OVERRIDE @@ -757,8 +757,7 @@ class npc_kelthuzad_abomination : public CreatureScript void JustDied(Unit* /*killer*/) OVERRIDE { - if (_instance) - _instance->SetData(DATA_ABOMINATION_KILLED, _instance->GetData(DATA_ABOMINATION_KILLED) + 1); + _instance->SetData(DATA_ABOMINATION_KILLED, _instance->GetData(DATA_ABOMINATION_KILLED) + 1); } private: diff --git a/src/server/scripts/Northrend/Nexus/EyeOfEternity/boss_malygos.cpp b/src/server/scripts/Northrend/Nexus/EyeOfEternity/boss_malygos.cpp index 4e386afae17..7ae9ce3faa6 100644 --- a/src/server/scripts/Northrend/Nexus/EyeOfEternity/boss_malygos.cpp +++ b/src/server/scripts/Northrend/Nexus/EyeOfEternity/boss_malygos.cpp @@ -450,7 +450,7 @@ public: { case ACTION_LAND_ENCOUNTER_START: events.CancelEventGroup(1); - if (Creature* alexstraszaBunny = me->GetMap()->GetCreature(instance->GetData64(DATA_ALEXSTRASZA_BUNNY_GUID))) + if (Creature* alexstraszaBunny = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_ALEXSTRASZA_BUNNY_GUID))) { Position pos; pos.m_positionZ = alexstraszaBunny->GetPositionZ(); @@ -713,7 +713,8 @@ public: { _firstCyclicMovementStarted = true; me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); - me->SetFacingToObject(me->GetMap()->GetCreature(instance->GetData64(DATA_ALEXSTRASZA_BUNNY_GUID))); + if (Creature* alexstraszaBunny = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_ALEXSTRASZA_BUNNY_GUID))) + me->SetFacingToObject(alexstraszaBunny); events.ScheduleEvent(EVENT_SUMMON_ARCANE_BOMB, 1*IN_MILLISECONDS, 0, PHASE_TWO); } _flyingOutOfPlatform = false; @@ -722,7 +723,8 @@ public: break; case POINT_PHASE_ONE_TO_TWO_TRANSITION: me->SetDisableGravity(true); - me->SetFacingToObject(me->GetMap()->GetCreature(instance->GetData64(DATA_ALEXSTRASZA_BUNNY_GUID))); + if (Creature* alexstraszaBunny = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_ALEXSTRASZA_BUNNY_GUID))) + me->SetFacingToObject(alexstraszaBunny); SendLightOverride(LIGHT_ARCANE_RUNES, 5*IN_MILLISECONDS); events.ScheduleEvent(EVENT_FLY_OUT_OF_PLATFORM, 18*IN_MILLISECONDS, 0, PHASE_TWO); break; @@ -780,7 +782,7 @@ public: me->CastCustomSpell(SPELL_RANDOM_PORTAL, SPELLVALUE_MAX_TARGETS, 1); break; case EVENT_LAND_START_ENCOUNTER: - if (GameObject* iris = me->GetMap()->GetGameObject(instance->GetData64(DATA_FOCUSING_IRIS_GUID))) + if (GameObject* iris = ObjectAccessor::GetGameObject(*me, instance->GetData64(DATA_FOCUSING_IRIS_GUID))) { me->SetFacingToObject(iris); iris->Delete(); // this is not the best way. @@ -837,7 +839,7 @@ public: case EVENT_FLY_OUT_OF_PLATFORM: if (!_performingDestroyPlatform) { - if (Creature* alexstraszaBunny = me->GetMap()->GetCreature(instance->GetData64(DATA_ALEXSTRASZA_BUNNY_GUID))) + if (Creature* alexstraszaBunny = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_ALEXSTRASZA_BUNNY_GUID))) { Position randomPosOnRadius; // Hardcodded retail value, reason is Z getters can fail... (TO DO: Change to getter when height calculation works on 100%!) @@ -908,7 +910,7 @@ public: if (!_flyingOutOfPlatform) { DoCast(me, SPELL_SUMMON_ARCANE_BOMB, true); - if (Creature* lastArcaneOverloadBunny = me->GetMap()->GetCreature(_arcaneOverloadGUID)) + if (Creature* lastArcaneOverloadBunny = ObjectAccessor::GetCreature(*me, _arcaneOverloadGUID)) DoCast(lastArcaneOverloadBunny, SPELL_ARCANE_BOMB_TRIGGER, true); } events.ScheduleEvent(EVENT_SUMMON_ARCANE_BOMB, urand(15, 16)*IN_MILLISECONDS, 2, PHASE_TWO); @@ -993,7 +995,7 @@ public: { _JustDied(); Talk(SAY_DEATH); - if (Creature* alexstraszaGiftBoxBunny = me->GetMap()->GetCreature(instance->GetData64(DATA_GIFT_BOX_BUNNY_GUID))) + if (Creature* alexstraszaGiftBoxBunny = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_GIFT_BOX_BUNNY_GUID))) { if (GetDifficulty() == RAID_DIFFICULTY_10MAN_NORMAL) alexstraszaGiftBoxBunny->SummonGameObject(GO_HEART_OF_MAGIC_10, HeartOfMagicSpawnPos.GetPositionX(), HeartOfMagicSpawnPos.GetPositionY(), @@ -1087,7 +1089,7 @@ public: { if (spell->Id == SPELL_PORTAL_OPENED) { - if (Creature* malygos = me->GetMap()->GetCreature(_instance->GetData64(DATA_MALYGOS))) + if (Creature* malygos = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_MALYGOS))) { if (malygos->AI()->GetData(DATA_PHASE) == PHASE_ONE) DoCast(me, SPELL_SUMMON_POWER_PARK, true); @@ -1101,15 +1103,12 @@ public: if (!me->HasAura(SPELL_PORTAL_VISUAL_CLOSED) && !me->HasAura(SPELL_PORTAL_OPENED)) DoCast(me, SPELL_PORTAL_VISUAL_CLOSED, true); - if (_instance) + if (Creature* malygos = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_MALYGOS))) { - if (Creature* malygos = me->GetMap()->GetCreature(_instance->GetData64(DATA_MALYGOS))) + if (malygos->AI()->GetData(DATA_PHASE) != PHASE_ONE && me->HasAura(SPELL_PORTAL_OPENED)) { - if (malygos->AI()->GetData(DATA_PHASE) != PHASE_ONE && me->HasAura(SPELL_PORTAL_OPENED)) - { - me->RemoveAura(SPELL_PORTAL_OPENED); - DoCast(me, SPELL_PORTAL_VISUAL_CLOSED, true); - } + me->RemoveAura(SPELL_PORTAL_OPENED); + DoCast(me, SPELL_PORTAL_VISUAL_CLOSED, true); } } } @@ -1143,9 +1142,8 @@ public: { me->GetMotionMaster()->MoveIdle(); - if (_instance) - if (Creature* malygos = me->GetMap()->GetCreature(_instance->GetData64(DATA_MALYGOS))) - me->GetMotionMaster()->MoveFollow(malygos, 0.0f, 0.0f); + if (Creature* malygos = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_MALYGOS))) + me->GetMotionMaster()->MoveFollow(malygos, 0.0f, 0.0f); } void UpdateAI(uint32 /*diff*/) OVERRIDE @@ -1153,7 +1151,7 @@ public: if (!_instance) return; - if (Creature* malygos = me->GetMap()->GetCreature(_instance->GetData64(DATA_MALYGOS))) + if (Creature* malygos = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_MALYGOS))) { if (malygos->AI()->GetData(DATA_PHASE) != PHASE_ONE || _instance->GetBossState(DATA_MALYGOS_EVENT) == FAIL) { @@ -1432,7 +1430,7 @@ class npc_nexus_lord : public CreatureScript void JustDied(Unit* /*killer*/) OVERRIDE { - if (Creature* malygos = me->GetMap()->GetCreature(_instance->GetData64(DATA_MALYGOS))) + if (Creature* malygos = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_MALYGOS))) malygos->AI()->SetData(DATA_SUMMON_DEATHS, malygos->AI()->GetData(DATA_SUMMON_DEATHS) + 1); } @@ -1499,7 +1497,7 @@ class npc_scion_of_eternity : public CreatureScript void JustDied(Unit* /*killer*/) OVERRIDE { - if (Creature* malygos = me->GetMap()->GetCreature(_instance->GetData64(DATA_MALYGOS))) + if (Creature* malygos = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_MALYGOS))) malygos->AI()->SetData(DATA_SUMMON_DEATHS, malygos->AI()->GetData(DATA_SUMMON_DEATHS) + 1); } @@ -1542,7 +1540,7 @@ public: void DoAction(int32 /*action*/) OVERRIDE { - if (Creature* malygos = me->GetMap()->GetCreature(_instance->GetData64(DATA_MALYGOS))) + if (Creature* malygos = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_MALYGOS))) { if (malygos->AI()->GetData(DATA_PHASE) == PHASE_TWO) me->DespawnOrUnsummon(6*IN_MILLISECONDS); @@ -2047,7 +2045,7 @@ class spell_scion_of_eternity_arcane_barrage : public SpellScriptLoader Creature* caster = GetCaster()->ToCreature(); InstanceScript* instance = caster->GetInstanceScript(); - Creature* malygos = caster->GetMap()->GetCreature(instance->GetData64(DATA_MALYGOS)); + Creature* malygos = ObjectAccessor::GetCreature(*caster, instance->GetData64(DATA_MALYGOS)); // If max possible targets are more than 1 then Scions wouldn't select previosly selected target, // in longer terms this means if spell picks target X then 2nd cast of this spell will pick smth else @@ -2232,6 +2230,7 @@ class spell_alexstrasza_bunny_destroy_platform_event : public SpellScriptLoader } }; +// 56070 - Summon Red Dragon Buddy class spell_wyrmrest_skytalon_summon_red_dragon_buddy : public SpellScriptLoader { public: @@ -2246,19 +2245,16 @@ class spell_wyrmrest_skytalon_summon_red_dragon_buddy : public SpellScriptLoader return GetCaster()->GetTypeId() == TYPEID_PLAYER; } - void ChangeSummonPos(SpellEffIndex /*effIndex*/) + void SetDest(SpellDestination& dest) { // Adjust effect summon position to lower Z - WorldLocation summonPos = *GetExplTargetDest(); - Position offset = { 0.0f, 0.0f, -80.0f, 0.0f }; - summonPos.RelocateOffset(offset); - SetExplTargetDest(summonPos); - GetHitDest()->RelocateOffset(offset); + Position const offset = { 0.0f, 0.0f, -80.0f, 0.0f }; + dest.RelocateOffset(offset); } void Register() OVERRIDE { - OnEffectHit += SpellEffectFn(spell_wyrmrest_skytalon_summon_red_dragon_buddy_SpellScript::ChangeSummonPos, EFFECT_0, SPELL_EFFECT_SUMMON); + OnDestinationTargetSelect += SpellDestinationTargetSelectFn(spell_wyrmrest_skytalon_summon_red_dragon_buddy_SpellScript::SetDest, EFFECT_0, TARGET_DEST_CASTER_RADIUS); } }; diff --git a/src/server/scripts/Northrend/Nexus/Nexus/boss_keristrasza.cpp b/src/server/scripts/Northrend/Nexus/Nexus/boss_keristrasza.cpp index 2f6a328b728..9943ad7e1b1 100644 --- a/src/server/scripts/Northrend/Nexus/Nexus/boss_keristrasza.cpp +++ b/src/server/scripts/Northrend/Nexus/Nexus/boss_keristrasza.cpp @@ -213,7 +213,7 @@ public: { InstanceScript* instance = go->GetInstanceScript(); - Creature* pKeristrasza = Unit::GetCreature(*go, instance ? instance->GetData64(DATA_KERISTRASZA) : 0); + Creature* pKeristrasza = ObjectAccessor::GetCreature(*go, instance->GetData64(DATA_KERISTRASZA)); if (pKeristrasza && pKeristrasza->IsAlive()) { // maybe these are hacks :( diff --git a/src/server/scripts/Northrend/Nexus/Nexus/boss_ormorok.cpp b/src/server/scripts/Northrend/Nexus/Nexus/boss_ormorok.cpp index aa6bb11447b..93e52c4da73 100644 --- a/src/server/scripts/Northrend/Nexus/Nexus/boss_ormorok.cpp +++ b/src/server/scripts/Northrend/Nexus/Nexus/boss_ormorok.cpp @@ -195,8 +195,8 @@ public: struct npc_crystal_spike_triggerAI : public ScriptedAI { - npc_crystal_spike_triggerAI(Creature* creature) : ScriptedAI(creature) - { + npc_crystal_spike_triggerAI(Creature* creature) : ScriptedAI(creature) + { _count = 0; _despawntimer = 0; } diff --git a/src/server/scripts/Northrend/Nexus/Oculus/oculus.cpp b/src/server/scripts/Northrend/Nexus/Oculus/oculus.cpp index 40e526219fa..506e16741fb 100644 --- a/src/server/scripts/Northrend/Nexus/Oculus/oculus.cpp +++ b/src/server/scripts/Northrend/Nexus/Oculus/oculus.cpp @@ -375,27 +375,16 @@ class spell_oculus_call_ruby_emerald_amber_drake : public SpellScriptLoader { PrepareSpellScript(spell_oculus_call_ruby_emerald_amber_drake_SpellScript); - void ChangeSummonPos(SpellEffIndex /*effIndex*/) + void SetDest(SpellDestination& dest) { // Adjust effect summon position - WorldLocation summonPos = *GetExplTargetDest(); - Position offset = { 0.0f, 0.0f, 12.0f, 0.0f }; - summonPos.RelocateOffset(offset); - SetExplTargetDest(summonPos); - GetHitDest()->RelocateOffset(offset); - } - - void ModDestHeight(SpellEffIndex /*effIndex*/) - { - // Used to cast visual effect at proper position - Position offset = { 0.0f, 0.0f, 12.0f, 0.0f }; - const_cast<WorldLocation*>(GetExplTargetDest())->RelocateOffset(offset); + Position const offset = { 0.0f, 0.0f, 12.0f, 0.0f }; + dest.RelocateOffset(offset); } void Register() OVERRIDE { - OnEffectHit += SpellEffectFn(spell_oculus_call_ruby_emerald_amber_drake_SpellScript::ChangeSummonPos, EFFECT_0, SPELL_EFFECT_SUMMON); - OnEffectLaunch += SpellEffectFn(spell_oculus_call_ruby_emerald_amber_drake_SpellScript::ModDestHeight, EFFECT_0, SPELL_EFFECT_SUMMON); + OnDestinationTargetSelect += SpellDestinationTargetSelectFn(spell_oculus_call_ruby_emerald_amber_drake_SpellScript::SetDest, EFFECT_0, TARGET_DEST_CASTER_FRONT); } }; diff --git a/src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_ionar.cpp b/src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_ionar.cpp index c666a36741b..1788ecacd35 100644 --- a/src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_ionar.cpp +++ b/src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_ionar.cpp @@ -168,7 +168,7 @@ public: for (std::list<uint64>::const_iterator itr = lSparkList.begin(); itr != lSparkList.end(); ++itr) { - if (Creature* pSpark = Unit::GetCreature(*me, *itr)) + if (Creature* pSpark = ObjectAccessor::GetCreature(*me, *itr)) { if (pSpark->IsAlive()) { @@ -297,11 +297,6 @@ class npc_spark_of_ionar : public CreatureScript public: npc_spark_of_ionar() : CreatureScript("npc_spark_of_ionar") { } - CreatureAI* GetAI(Creature* creature) const OVERRIDE - { - return GetInstanceAI<npc_spark_of_ionarAI>(creature); - } - struct npc_spark_of_ionarAI : public ScriptedAI { npc_spark_of_ionarAI(Creature* creature) : ScriptedAI(creature) @@ -336,7 +331,7 @@ public: void UpdateAI(uint32 uiDiff) OVERRIDE { // Despawn if the encounter is not running - if (instance && instance->GetBossState(DATA_IONAR) != IN_PROGRESS) + if (instance->GetBossState(DATA_IONAR) != IN_PROGRESS) { me->DespawnOrUnsummon(); return; @@ -345,13 +340,13 @@ public: // Prevent them to follow players through the whole instance if (uiCheckTimer <= uiDiff) { - Creature* pIonar = instance->instance->GetCreature(instance->GetData64(DATA_IONAR)); - if (pIonar && pIonar->IsAlive()) + Creature* ionar = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_IONAR)); + if (ionar && ionar->IsAlive()) { - if (me->GetDistance(pIonar) > DATA_MAX_SPARK_DISTANCE) + if (me->GetDistance(ionar) > DATA_MAX_SPARK_DISTANCE) { Position pos; - pIonar->GetPosition(&pos); + ionar->GetPosition(&pos); me->SetSpeed(MOVE_RUN, 2.0f); me->GetMotionMaster()->Clear(); @@ -369,6 +364,10 @@ public: } }; + CreatureAI* GetAI(Creature* creature) const OVERRIDE + { + return GetInstanceAI<npc_spark_of_ionarAI>(creature); + } }; void AddSC_boss_ionar() diff --git a/src/server/scripts/Northrend/Ulduar/HallsOfStone/boss_maiden_of_grief.cpp b/src/server/scripts/Northrend/Ulduar/HallsOfStone/boss_maiden_of_grief.cpp index 08d12d715f9..927f4490770 100644 --- a/src/server/scripts/Northrend/Ulduar/HallsOfStone/boss_maiden_of_grief.cpp +++ b/src/server/scripts/Northrend/Ulduar/HallsOfStone/boss_maiden_of_grief.cpp @@ -15,146 +15,130 @@ * with this program. If not, see <http://www.gnu.org/licenses/>. */ -/* Script Data Start -SDName: Boss maiden_of_grief -SDAuthor: LordVanMartin -SD%Complete: -SDComment: -SDCategory: -Script Data End */ - #include "ScriptMgr.h" #include "ScriptedCreature.h" #include "halls_of_stone.h" +enum Yells +{ + SAY_AGGRO = 0, + SAY_SLAY = 1, + SAY_DEATH = 2, + SAY_STUN = 3 +}; + enum Spells { - SPELL_PARTING_SORROW = 59723, - SPELL_STORM_OF_GRIEF_N = 50752, - SPELL_STORM_OF_GRIEF_H = 59772, - SPELL_SHOCK_OF_SORROW_N = 50760, - SPELL_SHOCK_OF_SORROW_H = 59726, - SPELL_PILLAR_OF_WOE_N = 50761, - SPELL_PILLAR_OF_WOE_H = 59727 + SPELL_PARTING_SORROW = 59723, + SPELL_STORM_OF_GRIEF = 50752, + SPELL_SHOCK_OF_SORROW = 50760, + SPELL_PILLAR_OF_WOE = 50761 }; -enum Yells +enum Events { - SAY_AGGRO = 0, - SAY_SLAY = 1, - SAY_DEATH = 2, - SAY_STUN = 3 + EVENT_PARTING_SORROW = 1, + EVENT_STORM_OF_GRIEF, + EVENT_SHOCK_OF_SORROW, + EVENT_PILLAR_OF_WOE }; enum Achievements { - ACHIEV_GOOD_GRIEF_START_EVENT = 20383, + ACHIEV_GOOD_GRIEF_START_EVENT = 20383, }; class boss_maiden_of_grief : public CreatureScript { -public: - boss_maiden_of_grief() : CreatureScript("boss_maiden_of_grief") { } + public: + boss_maiden_of_grief() : CreatureScript("boss_maiden_of_grief") { } - struct boss_maiden_of_griefAI : public ScriptedAI - { - boss_maiden_of_griefAI(Creature* creature) : ScriptedAI(creature) + struct boss_maiden_of_griefAI : public BossAI { - instance = me->GetInstanceScript(); - } - - InstanceScript* instance; + boss_maiden_of_griefAI(Creature* creature) : BossAI(creature, DATA_MAIDEN_OF_GRIEF) { } - uint32 PartingSorrowTimer; - uint32 StormOfGriefTimer; - uint32 ShockOfSorrowTimer; - uint32 PillarOfWoeTimer; - - void Reset() OVERRIDE - { - PartingSorrowTimer = urand(25000, 30000); - StormOfGriefTimer = 10000; - ShockOfSorrowTimer = 20000+rand()%5000; - PillarOfWoeTimer = urand(5000, 15000); - - instance->SetBossState(DATA_MAIDEN_OF_GRIEF, NOT_STARTED); - instance->DoStopTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEV_GOOD_GRIEF_START_EVENT); - } - - void EnterCombat(Unit* /*who*/) OVERRIDE - { - Talk(SAY_AGGRO); + void Reset() OVERRIDE + { + _Reset(); - instance->SetBossState(DATA_MAIDEN_OF_GRIEF, IN_PROGRESS); - instance->DoStartTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEV_GOOD_GRIEF_START_EVENT); - } + if (IsHeroic()) + events.ScheduleEvent(EVENT_PARTING_SORROW, urand(25000, 30000)); + events.ScheduleEvent(EVENT_STORM_OF_GRIEF, 10000); + events.ScheduleEvent(EVENT_SHOCK_OF_SORROW, urand(20000, 25000)); + events.ScheduleEvent(EVENT_PILLAR_OF_WOE, urand(5000, 15000)); - void UpdateAI(uint32 diff) OVERRIDE - { - //Return since we have no target - if (!UpdateVictim()) - return; + instance->DoStopTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEV_GOOD_GRIEF_START_EVENT); + } - if (IsHeroic()) + void EnterCombat(Unit* /*who*/) OVERRIDE { - if (PartingSorrowTimer <= diff) - { - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0)) - DoCast(target, SPELL_PARTING_SORROW); + _EnterCombat(); + Talk(SAY_AGGRO); - PartingSorrowTimer = urand(30000, 40000); - } else PartingSorrowTimer -= diff; + instance->DoStartTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEV_GOOD_GRIEF_START_EVENT); } - if (StormOfGriefTimer <= diff) + void KilledUnit(Unit* who) OVERRIDE { - DoCastVictim(SPELL_STORM_OF_GRIEF_N, true); - StormOfGriefTimer = urand(15000, 20000); - } else StormOfGriefTimer -= diff; + if (who->GetTypeId() == TYPEID_PLAYER) + Talk(SAY_SLAY); + } - if (ShockOfSorrowTimer <= diff) + void JustDied(Unit* /*killer*/) OVERRIDE { - DoResetThreat(); - Talk(SAY_STUN); - DoCast(me, SPELL_SHOCK_OF_SORROW_N); - ShockOfSorrowTimer = urand(20000, 30000); - } else ShockOfSorrowTimer -= diff; + _JustDied(); + Talk(SAY_DEATH); + } - if (PillarOfWoeTimer <= diff) + void UpdateAI(uint32 diff) OVERRIDE { - Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1); + if (!UpdateVictim()) + return; - if (target) - DoCast(target, SPELL_PILLAR_OF_WOE_N); - else - DoCastVictim(SPELL_PILLAR_OF_WOE_N); + events.Update(diff); - PillarOfWoeTimer = urand(5000, 25000); - } else PillarOfWoeTimer -= diff; - - DoMeleeAttackIfReady(); - } + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; - void JustDied(Unit* /*killer*/) OVERRIDE - { - Talk(SAY_DEATH); - - instance->SetBossState(DATA_MAIDEN_OF_GRIEF, DONE); - } + while (uint32 eventId = events.ExecuteEvent()) + { + switch (eventId) + { + case EVENT_PARTING_SORROW: + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 0.0f, true)) + DoCast(target, SPELL_PARTING_SORROW); + events.ScheduleEvent(EVENT_PARTING_SORROW, urand(30000, 40000)); + break; + case EVENT_STORM_OF_GRIEF: + DoCastVictim(SPELL_STORM_OF_GRIEF, true); + events.ScheduleEvent(EVENT_STORM_OF_GRIEF, urand(15000, 20000)); + break; + case EVENT_SHOCK_OF_SORROW: + DoResetThreat(); + Talk(SAY_STUN); + DoCastAOE(SPELL_SHOCK_OF_SORROW); + events.ScheduleEvent(EVENT_SHOCK_OF_SORROW, urand(20000, 30000)); + break; + case EVENT_PILLAR_OF_WOE: + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1, 0.0f, true)) + DoCast(target, SPELL_PILLAR_OF_WOE); + else + DoCastVictim(SPELL_PILLAR_OF_WOE); + events.ScheduleEvent(EVENT_PILLAR_OF_WOE, urand(5000, 25000)); + break; + default: + break; + } + } + + DoMeleeAttackIfReady(); + } + }; - void KilledUnit(Unit* victim) OVERRIDE + CreatureAI* GetAI(Creature* creature) const OVERRIDE { - if (victim->GetTypeId() != TYPEID_PLAYER) - return; - - Talk(SAY_SLAY); + return GetHallsOfStoneAI<boss_maiden_of_griefAI>(creature); } - }; - - CreatureAI* GetAI(Creature* creature) const OVERRIDE - { - return GetHallsOfStoneAI<boss_maiden_of_griefAI>(creature); - } }; void AddSC_boss_maiden_of_grief() 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 a8f933431c3..9599700eccb 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 @@ -1253,6 +1253,7 @@ class spell_algalon_remove_phase : public SpellScriptLoader } }; +// 62295 - Cosmic Smash class spell_algalon_cosmic_smash : public SpellScriptLoader { public: @@ -1262,16 +1263,15 @@ class spell_algalon_cosmic_smash : public SpellScriptLoader { PrepareSpellScript(spell_algalon_cosmic_smash_SpellScript); - void ModDestHeight(SpellEffIndex /*effIndex*/) + void ModDestHeight(SpellDestination& dest) { - Position offset = {0.0f, 0.0f, 65.0f, 0.0f}; - const_cast<WorldLocation*>(GetExplTargetDest())->RelocateOffset(offset); - GetHitDest()->RelocateOffset(offset); + Position const offset = { 0.0f, 0.0f, 65.0f, 0.0f }; + dest.RelocateOffset(offset); } void Register() OVERRIDE { - OnEffectLaunch += SpellEffectFn(spell_algalon_cosmic_smash_SpellScript::ModDestHeight, EFFECT_0, SPELL_EFFECT_SUMMON); + OnDestinationTargetSelect += SpellDestinationTargetSelectFn(spell_algalon_cosmic_smash_SpellScript::ModDestHeight, EFFECT_0, TARGET_DEST_CASTER_SUMMON); } }; 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 779adf67211..dff001fee05 100644 --- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_flame_leviathan.cpp +++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_flame_leviathan.cpp @@ -1192,7 +1192,7 @@ class npc_lorekeeper : public CreatureScript bool OnGossipHello(Player* player, Creature* creature) OVERRIDE { InstanceScript* instance = creature->GetInstanceScript(); - if (instance && instance->GetData(BOSS_LEVIATHAN) !=DONE && player) + if (instance->GetData(BOSS_LEVIATHAN) != DONE && player) { player->PrepareGossipMenu(creature); @@ -1245,7 +1245,7 @@ public: //bool OnGossipHello(Player* player, Creature* creature) OVERRIDE //{ // InstanceScript* instance = creature->GetInstanceScript(); - // if (instance && instance->GetData(BOSS_LEVIATHAN) !=DONE) + // if (instance->GetData(BOSS_LEVIATHAN) !=DONE) // { // player->PrepareGossipMenu(creature); // diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_hodir.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_hodir.cpp index 480c04c3254..169a7085672 100644 --- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_hodir.cpp +++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_hodir.cpp @@ -227,7 +227,7 @@ class npc_flash_freeze : public CreatureScript // Prevents to have Ice Block on other place than target is me->NearTeleportTo(target->GetPositionX(), target->GetPositionY(), target->GetPositionZ(), target->GetOrientation()); if (target->GetTypeId() == TYPEID_PLAYER) - if (Creature* Hodir = ObjectAccessor::GetCreature(*me, instance ? instance->GetData64(BOSS_HODIR) : 0)) + if (Creature* Hodir = ObjectAccessor::GetCreature(*me, instance->GetData64(BOSS_HODIR))) Hodir->AI()->DoAction(ACTION_CHEESE_THE_FREEZE); } } @@ -279,7 +279,7 @@ class npc_ice_block : public CreatureScript { Helper->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_DISABLE_MOVE | UNIT_FLAG_STUNNED | UNIT_FLAG_PACIFIED); - if (Creature* Hodir = ObjectAccessor::GetCreature(*me, instance ? instance->GetData64(BOSS_HODIR) : 0)) + if (Creature* Hodir = ObjectAccessor::GetCreature(*me, instance->GetData64(BOSS_HODIR))) { if (!Hodir->IsInCombat()) { @@ -658,7 +658,7 @@ class npc_hodir_priest : public CreatureScript void JustDied(Unit* /*killer*/) OVERRIDE { - if (Creature* Hodir = ObjectAccessor::GetCreature(*me, instance ? instance->GetData64(BOSS_HODIR) : 0)) + if (Creature* Hodir = ObjectAccessor::GetCreature(*me, instance->GetData64(BOSS_HODIR))) Hodir->AI()->DoAction(ACTION_I_HAVE_THE_COOLEST_FRIENDS); } @@ -720,7 +720,7 @@ class npc_hodir_shaman : public CreatureScript void JustDied(Unit* /*killer*/) OVERRIDE { - if (Creature* Hodir = ObjectAccessor::GetCreature(*me, instance ? instance->GetData64(BOSS_HODIR) : 0)) + if (Creature* Hodir = ObjectAccessor::GetCreature(*me, instance->GetData64(BOSS_HODIR))) Hodir->AI()->DoAction(ACTION_I_HAVE_THE_COOLEST_FRIENDS); } @@ -781,7 +781,7 @@ class npc_hodir_druid : public CreatureScript void JustDied(Unit* /*killer*/) OVERRIDE { - if (Creature* Hodir = ObjectAccessor::GetCreature(*me, instance ? instance->GetData64(BOSS_HODIR) : 0)) + if (Creature* Hodir = ObjectAccessor::GetCreature(*me, instance->GetData64(BOSS_HODIR))) Hodir->AI()->DoAction(ACTION_I_HAVE_THE_COOLEST_FRIENDS); } @@ -861,7 +861,7 @@ class npc_hodir_mage : public CreatureScript void JustDied(Unit* /*killer*/) OVERRIDE { - if (Creature* Hodir = ObjectAccessor::GetCreature(*me, instance ? instance->GetData64(BOSS_HODIR) : 0)) + if (Creature* Hodir = ObjectAccessor::GetCreature(*me, instance->GetData64(BOSS_HODIR))) Hodir->AI()->DoAction(ACTION_I_HAVE_THE_COOLEST_FRIENDS); } diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_razorscale.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_razorscale.cpp index 862ee2c786b..fee7a3ac0b7 100644 --- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_razorscale.cpp +++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_razorscale.cpp @@ -312,7 +312,7 @@ class go_razorscale_harpoon : public GameObjectScript bool OnGossipHello(Player* /*player*/, GameObject* go) OVERRIDE { InstanceScript* instance = go->GetInstanceScript(); - if (ObjectAccessor::GetCreature(*go, instance ? instance->GetData64(BOSS_RAZORSCALE) : 0)) + if (ObjectAccessor::GetCreature(*go, instance->GetData64(BOSS_RAZORSCALE))) go->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE); return false; } @@ -347,14 +347,14 @@ class boss_razorscale : public CreatureScript me->SetReactState(REACT_PASSIVE); PermaGround = false; HarpoonCounter = 0; - if (Creature* commander = ObjectAccessor::GetCreature(*me, instance ? instance->GetData64(DATA_EXPEDITION_COMMANDER) : 0)) + if (Creature* commander = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_EXPEDITION_COMMANDER))) commander->AI()->DoAction(ACTION_COMMANDER_RESET); } void EnterCombat(Unit* /*who*/) OVERRIDE { _EnterCombat(); - if (Creature* controller = ObjectAccessor::GetCreature(*me, instance ? instance->GetData64(DATA_RAZORSCALE_CONTROL) : 0)) + if (Creature* controller = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_RAZORSCALE_CONTROL))) controller->AI()->DoAction(ACTION_HARPOON_BUILD); me->SetSpeed(MOVE_FLIGHT, 3.0f, true); me->SetReactState(REACT_PASSIVE); @@ -369,7 +369,7 @@ class boss_razorscale : public CreatureScript void JustDied(Unit* /*killer*/) OVERRIDE { _JustDied(); - if (Creature* controller = ObjectAccessor::GetCreature(*me, instance ? instance->GetData64(DATA_RAZORSCALE_CONTROL) : 0)) + if (Creature* controller = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_RAZORSCALE_CONTROL))) controller->AI()->Reset(); } @@ -445,7 +445,7 @@ class boss_razorscale : public CreatureScript me->SetCanFly(false); me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_STUNNED | UNIT_FLAG_PACIFIED); - if (Creature* commander = ObjectAccessor::GetCreature(*me, instance ? instance->GetData64(DATA_EXPEDITION_COMMANDER) : 0)) + if (Creature* commander = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_EXPEDITION_COMMANDER))) commander->AI()->DoAction(ACTION_GROUND_PHASE); events.ScheduleEvent(EVENT_BREATH, 30000, 0, PHASE_GROUND); events.ScheduleEvent(EVENT_BUFFET, 33000, 0, PHASE_GROUND); @@ -461,7 +461,7 @@ class boss_razorscale : public CreatureScript return; case EVENT_BUFFET: DoCastAOE(SPELL_WINGBUFFET); - if (Creature* controller = ObjectAccessor::GetCreature(*me, instance ? instance->GetData64(DATA_RAZORSCALE_CONTROL) : 0)) + if (Creature* controller = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_RAZORSCALE_CONTROL))) controller->CastSpell(controller, SPELL_FLAMED, true); events.CancelEvent(EVENT_BUFFET); return; @@ -689,7 +689,7 @@ class npc_expedition_commander : public CreatureScript Phase = 5; break; case 5: - if (Creature* Razorscale = ObjectAccessor::GetCreature(*me, instance ? instance->GetData64(BOSS_RAZORSCALE) : 0)) + if (Creature* Razorscale = ObjectAccessor::GetCreature(*me, instance->GetData64(BOSS_RAZORSCALE))) { Razorscale->AI()->DoAction(ACTION_EVENT_START); me->SetInCombatWith(Razorscale); @@ -720,7 +720,7 @@ class npc_expedition_commander : public CreatureScript bool OnGossipHello(Player* player, Creature* creature) OVERRIDE { InstanceScript* instance = creature->GetInstanceScript(); - if (instance && instance->GetBossState(BOSS_RAZORSCALE) == NOT_STARTED) + if (instance->GetBossState(BOSS_RAZORSCALE) == NOT_STARTED) { player->PrepareGossipMenu(creature); diff --git a/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_svala.cpp b/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_svala.cpp index c46158b0f7a..2a24b1145c0 100644 --- a/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_svala.cpp +++ b/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_svala.cpp @@ -258,7 +258,7 @@ class boss_svala : public CreatureScript case EVENT_INTRO_TRANSFORM_0: { if (Creature* arthas = ObjectAccessor::GetCreature(*me, _arthasGUID)) - arthas->CastSpell(me, SPELL_TRANSFORMING_CHANNEL, false); + arthas->CastSpell(me, SPELL_TRANSFORMING_CHANNEL, true); Position pos; pos.Relocate(me); pos.m_positionZ += 8.0f; diff --git a/src/server/scripts/Northrend/VaultOfArchavon/boss_emalon.cpp b/src/server/scripts/Northrend/VaultOfArchavon/boss_emalon.cpp index 4dd3aa9916b..7377029080f 100644 --- a/src/server/scripts/Northrend/VaultOfArchavon/boss_emalon.cpp +++ b/src/server/scripts/Northrend/VaultOfArchavon/boss_emalon.cpp @@ -195,7 +195,7 @@ class npc_tempest_minion : public CreatureScript void JustDied(Unit* /*killer*/) OVERRIDE { - if (Creature* emalon = Unit::GetCreature(*me, instance ? instance->GetData64(DATA_EMALON) : 0)) + if (Creature* emalon = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_EMALON))) { if (emalon->IsAlive()) { @@ -210,7 +210,7 @@ class npc_tempest_minion : public CreatureScript DoZoneInCombat(); events.ScheduleEvent(EVENT_SHOCK, 20000); - if (Creature* pEmalon = Unit::GetCreature(*me, instance ? instance->GetData64(DATA_EMALON) : 0)) + if (Creature* pEmalon = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_EMALON))) { if (!pEmalon->GetVictim() && pEmalon->AI()) pEmalon->AI()->AttackStart(who); diff --git a/src/server/scripts/Northrend/VaultOfArchavon/boss_toravon.cpp b/src/server/scripts/Northrend/VaultOfArchavon/boss_toravon.cpp index ccb1b5ed7d8..bd2128a1b4c 100644 --- a/src/server/scripts/Northrend/VaultOfArchavon/boss_toravon.cpp +++ b/src/server/scripts/Northrend/VaultOfArchavon/boss_toravon.cpp @@ -241,7 +241,7 @@ class npc_frozen_orb_stalker : public CreatureScript npc_frozen_orb_stalkerAI(Creature* creature) : ScriptedAI(creature) { creature->SetVisible(false); - creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE|UNIT_FLAG_NON_ATTACKABLE|UNIT_FLAG_DISABLE_MOVE); + creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE | UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_DISABLE_MOVE); creature->SetReactState(REACT_PASSIVE); instance = creature->GetInstanceScript(); @@ -256,7 +256,7 @@ class npc_frozen_orb_stalker : public CreatureScript return; spawned = true; - Unit* toravon = me->GetCreature(*me, instance ? instance->GetData64(DATA_TORAVON) : 0); + Unit* toravon = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_TORAVON)); if (!toravon) return; diff --git a/src/server/scripts/Northrend/VioletHold/boss_cyanigosa.cpp b/src/server/scripts/Northrend/VioletHold/boss_cyanigosa.cpp index ec20489bfc2..e53d046b396 100644 --- a/src/server/scripts/Northrend/VioletHold/boss_cyanigosa.cpp +++ b/src/server/scripts/Northrend/VioletHold/boss_cyanigosa.cpp @@ -90,7 +90,7 @@ public: void UpdateAI(uint32 diff) OVERRIDE { - if (instance && instance->GetData(DATA_REMOVE_NPC) == 1) + if (instance->GetData(DATA_REMOVE_NPC) == 1) { me->DespawnOrUnsummon(); instance->SetData(DATA_REMOVE_NPC, 0); diff --git a/src/server/scripts/Northrend/VioletHold/boss_erekem.cpp b/src/server/scripts/Northrend/VioletHold/boss_erekem.cpp index 81edfd65d03..441603dcdc8 100644 --- a/src/server/scripts/Northrend/VioletHold/boss_erekem.cpp +++ b/src/server/scripts/Northrend/VioletHold/boss_erekem.cpp @@ -79,12 +79,12 @@ public: else if (instance->GetData(DATA_WAVE_COUNT) == 12) instance->SetData(DATA_2ND_BOSS_EVENT, NOT_STARTED); - if (Creature* pGuard1 = Unit::GetCreature(*me, instance ? instance->GetData64(DATA_EREKEM_GUARD_1) : 0)) + if (Creature* pGuard1 = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_EREKEM_GUARD_1))) { if (!pGuard1->IsAlive()) pGuard1->Respawn(); } - if (Creature* pGuard2 = Unit::GetCreature(*me, instance ? instance->GetData64(DATA_EREKEM_GUARD_2) : 0)) + if (Creature* pGuard2 = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_EREKEM_GUARD_2))) { if (!pGuard2->IsAlive()) pGuard2->Respawn(); @@ -103,15 +103,15 @@ public: who->SetInCombatWith(me); DoStartMovement(who); - if (Creature* pGuard1 = Unit::GetCreature(*me, instance ? instance->GetData64(DATA_EREKEM_GUARD_1) : 0)) + if (Creature* pGuard1 = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_EREKEM_GUARD_1))) { - pGuard1->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC|UNIT_FLAG_NON_ATTACKABLE); + pGuard1->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC | UNIT_FLAG_NON_ATTACKABLE); if (!pGuard1->GetVictim() && pGuard1->AI()) pGuard1->AI()->AttackStart(who); } - if (Creature* pGuard2 = Unit::GetCreature(*me, instance ? instance->GetData64(DATA_EREKEM_GUARD_2) : 0)) + if (Creature* pGuard2 = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_EREKEM_GUARD_2))) { - pGuard2->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC|UNIT_FLAG_NON_ATTACKABLE); + pGuard2->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC | UNIT_FLAG_NON_ATTACKABLE); if (!pGuard2->GetVictim() && pGuard2->AI()) pGuard2->AI()->AttackStart(who); } @@ -148,9 +148,9 @@ public: //spam stormstrike in hc mode if spawns are dead if (IsHeroic()) { - if (Creature* pGuard1 = Unit::GetCreature(*me, instance ? instance->GetData64(DATA_EREKEM_GUARD_1) : 0)) + if (Creature* pGuard1 = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_EREKEM_GUARD_1))) { - if (Creature* pGuard2 = Unit::GetCreature(*me, instance ? instance->GetData64(DATA_EREKEM_GUARD_2) : 0)) + if (Creature* pGuard2 = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_EREKEM_GUARD_2))) { if (!pGuard1->IsAlive() && !pGuard2->IsAlive()) DoCastVictim(SPELL_STORMSTRIKE); @@ -168,12 +168,12 @@ public: { if (uint64 TargetGUID = GetChainHealTargetGUID()) { - if (Creature* target = Unit::GetCreature(*me, TargetGUID)) + if (Creature* target = ObjectAccessor::GetCreature(*me, TargetGUID)) DoCast(target, SPELL_CHAIN_HEAL); //If one of the adds is dead spawn heals faster - Creature* pGuard1 = Unit::GetCreature(*me, instance ? instance->GetData64(DATA_EREKEM_GUARD_1) : 0); - Creature* pGuard2 = Unit::GetCreature(*me, instance ? instance->GetData64(DATA_EREKEM_GUARD_2) : 0); + Creature* pGuard1 = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_EREKEM_GUARD_1)); + Creature* pGuard2 = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_EREKEM_GUARD_2)); uiChainHealTimer = ((pGuard1 && !pGuard1->IsAlive()) || (pGuard2 && !pGuard2->IsAlive()) ? 3000 : 8000) + rand()%3000; } } else uiChainHealTimer -= diff; @@ -229,11 +229,11 @@ public: if (HealthBelowPct(85)) return me->GetGUID(); - Creature* pGuard1 = Unit::GetCreature(*me, instance ? instance->GetData64(DATA_EREKEM_GUARD_1) : 0); + Creature* pGuard1 = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_EREKEM_GUARD_1)); if (pGuard1 && pGuard1->IsAlive() && !pGuard1->HealthAbovePct(75)) return pGuard1->GetGUID(); - Creature* pGuard2 = Unit::GetCreature(*me, instance ? instance->GetData64(DATA_EREKEM_GUARD_2) : 0); + Creature* pGuard2 = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_EREKEM_GUARD_2)); if (pGuard2 && pGuard2->IsAlive() && !pGuard2->HealthAbovePct(75)) return pGuard2->GetGUID(); diff --git a/src/server/scripts/Northrend/VioletHold/violet_hold.cpp b/src/server/scripts/Northrend/VioletHold/violet_hold.cpp index 79025bb5c0f..5f79e609e01 100644 --- a/src/server/scripts/Northrend/VioletHold/violet_hold.cpp +++ b/src/server/scripts/Northrend/VioletHold/violet_hold.cpp @@ -446,7 +446,7 @@ public: void Reset() OVERRIDE { - if (instance && !uiBoss) + if (!uiBoss) uiBoss = instance->GetData(DATA_WAVE_COUNT) == 6 ? instance->GetData(DATA_FIRST_BOSS) : instance->GetData(DATA_SECOND_BOSS); me->SetReactState(REACT_PASSIVE); me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC|UNIT_FLAG_NON_ATTACKABLE); @@ -486,7 +486,7 @@ public: void UpdateAI(uint32 diff) OVERRIDE { - if (instance && instance->GetData(DATA_MAIN_EVENT_PHASE) != IN_PROGRESS) + if (instance->GetData(DATA_MAIN_EVENT_PHASE) != IN_PROGRESS) me->CastStop(); npc_escortAI::UpdateAI(diff); @@ -723,7 +723,7 @@ struct violet_hold_trashAI : public npc_escortAI void UpdateAI(uint32) OVERRIDE { - if (instance && instance->GetData(DATA_MAIN_EVENT_PHASE) != IN_PROGRESS) + if (instance->GetData(DATA_MAIN_EVENT_PHASE) != IN_PROGRESS) me->CastStop(); if (!bHasGotMovingPoints) diff --git a/src/server/scripts/Northrend/zone_borean_tundra.cpp b/src/server/scripts/Northrend/zone_borean_tundra.cpp index cbad220aed6..f840c0562b3 100644 --- a/src/server/scripts/Northrend/zone_borean_tundra.cpp +++ b/src/server/scripts/Northrend/zone_borean_tundra.cpp @@ -428,8 +428,8 @@ public: struct npc_jennyAI : public ScriptedAI { - npc_jennyAI(Creature* creature) : ScriptedAI(creature) - { + npc_jennyAI(Creature* creature) : ScriptedAI(creature) + { setCrateNumber = false; } @@ -1359,10 +1359,7 @@ public: struct npc_counselor_talbotAI : public ScriptedAI { - npc_counselor_talbotAI(Creature* creature) : ScriptedAI(creature) - { - creature->RestoreFaction(); - } + npc_counselor_talbotAI(Creature* creature) : ScriptedAI(creature) { } uint64 leryssaGUID; uint64 arlosGUID; diff --git a/src/server/scripts/Northrend/zone_dragonblight.cpp b/src/server/scripts/Northrend/zone_dragonblight.cpp index f91f5d8c007..7487c3c8828 100644 --- a/src/server/scripts/Northrend/zone_dragonblight.cpp +++ b/src/server/scripts/Northrend/zone_dragonblight.cpp @@ -150,7 +150,10 @@ class npc_commander_eligor_dawnbringer : public CreatureScript struct npc_commander_eligor_dawnbringerAI : public ScriptedAI { - npc_commander_eligor_dawnbringerAI(Creature* creature) : ScriptedAI(creature) { } + npc_commander_eligor_dawnbringerAI(Creature* creature) : ScriptedAI(creature) + { + talkWing = 0; + } void Reset() OVERRIDE { @@ -649,7 +652,10 @@ class npc_torturer_lecraft : public CreatureScript struct npc_torturer_lecraftAI : public ScriptedAI { - npc_torturer_lecraftAI(Creature* creature) : ScriptedAI(creature) { } + npc_torturer_lecraftAI(Creature* creature) : ScriptedAI(creature) + { + _playerGUID = 0; + } void Reset() OVERRIDE { diff --git a/src/server/scripts/Northrend/zone_grizzly_hills.cpp b/src/server/scripts/Northrend/zone_grizzly_hills.cpp index bacc6de57f0..112d42441b9 100644 --- a/src/server/scripts/Northrend/zone_grizzly_hills.cpp +++ b/src/server/scripts/Northrend/zone_grizzly_hills.cpp @@ -20,8 +20,6 @@ #include "ScriptedCreature.h" #include "ScriptedEscortAI.h" #include "Player.h" -#include "Spell.h" -#include "SpellInfo.h" #include "SpellScript.h" #include "CreatureTextMgr.h" diff --git a/src/server/scripts/Northrend/zone_storm_peaks.cpp b/src/server/scripts/Northrend/zone_storm_peaks.cpp index 69e4e65225a..70de4d4758d 100644 --- a/src/server/scripts/Northrend/zone_storm_peaks.cpp +++ b/src/server/scripts/Northrend/zone_storm_peaks.cpp @@ -451,7 +451,10 @@ public: struct npc_brann_bronzebeard_keystoneAI : public ScriptedAI { - npc_brann_bronzebeard_keystoneAI(Creature* creature) : ScriptedAI(creature) { } + npc_brann_bronzebeard_keystoneAI(Creature* creature) : ScriptedAI(creature) + { + objectCounter = 0; + } void Reset() OVERRIDE { @@ -634,7 +637,10 @@ public: struct npc_king_jokkum_vehicleAI : public VehicleAI { - npc_king_jokkum_vehicleAI(Creature* creature) : VehicleAI(creature) { } + npc_king_jokkum_vehicleAI(Creature* creature) : VehicleAI(creature) + { + pathEnd = false; + } void Reset() OVERRIDE { diff --git a/src/server/scripts/Northrend/zone_wintergrasp.cpp b/src/server/scripts/Northrend/zone_wintergrasp.cpp index 311b18524b2..e218741649d 100644 --- a/src/server/scripts/Northrend/zone_wintergrasp.cpp +++ b/src/server/scripts/Northrend/zone_wintergrasp.cpp @@ -249,7 +249,10 @@ class npc_wg_queue : public CreatureScript struct npc_wg_queueAI : public ScriptedAI { - npc_wg_queueAI(Creature* creature) : ScriptedAI(creature) { } + npc_wg_queueAI(Creature* creature) : ScriptedAI(creature) + { + FrostArmor_Timer = 0; + } uint32 FrostArmor_Timer; diff --git a/src/server/scripts/Outland/BlackTemple/boss_illidan.cpp b/src/server/scripts/Outland/BlackTemple/boss_illidan.cpp index 3bbd41afc89..d74aecb9b25 100644 --- a/src/server/scripts/Outland/BlackTemple/boss_illidan.cpp +++ b/src/server/scripts/Outland/BlackTemple/boss_illidan.cpp @@ -1672,7 +1672,7 @@ public: { if (Check_Timer <= diff) { - if (instance && instance->GetBossState(DATA_ILLIDARI_COUNCIL) == DONE) + if (instance->GetBossState(DATA_ILLIDARI_COUNCIL) == DONE) me->SetVisible(true); Check_Timer = 5000; 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 6d632c81bca..9055bb1862d 100644 --- a/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_fathomlord_karathress.cpp +++ b/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_fathomlord_karathress.cpp @@ -139,21 +139,20 @@ public: RAdvisors[0] = instance->GetData64(DATA_SHARKKIS); RAdvisors[1] = instance->GetData64(DATA_TIDALVESS); RAdvisors[2] = instance->GetData64(DATA_CARIBDIS); - //Respawn of the 3 Advisors - Creature* pAdvisor = NULL; - for (int i=0; i<MAX_ADVISORS; ++i) + // Respawn of the 3 Advisors + for (uint8 i = 0; i < MAX_ADVISORS; ++i) if (RAdvisors[i]) { - pAdvisor = (Unit::GetCreature((*me), RAdvisors[i])); - if (pAdvisor && !pAdvisor->IsAlive()) + Creature* advisor = ObjectAccessor::GetCreature(*me, RAdvisors[i]); + if (advisor && !advisor->IsAlive()) { - pAdvisor->Respawn(); - pAdvisor->AI()->EnterEvadeMode(); - pAdvisor->GetMotionMaster()->MoveTargetedHome(); + advisor->Respawn(); + advisor->AI()->EnterEvadeMode(); + advisor->GetMotionMaster()->MoveTargetedHome(); } } - instance->SetData(DATA_KARATHRESSEVENT, NOT_STARTED); + instance->SetData(DATA_KARATHRESSEVENT, NOT_STARTED); } void EventSharkkisDeath() @@ -215,7 +214,7 @@ public: void UpdateAI(uint32 diff) OVERRIDE { //Only if not incombat check if the event is started - if (!me->IsInCombat() && instance && instance->GetData(DATA_KARATHRESSEVENT)) + if (!me->IsInCombat() && instance->GetData(DATA_KARATHRESSEVENT)) { if (Unit* target = Unit::GetUnit(*me, instance->GetData64(DATA_KARATHRESSEVENT_STARTER))) { @@ -229,7 +228,7 @@ public: return; //someone evaded! - if (instance && !instance->GetData(DATA_KARATHRESSEVENT)) + if (!instance->GetData(DATA_KARATHRESSEVENT)) { EnterEvadeMode(); return; @@ -269,12 +268,11 @@ public: { BlessingOfTides = true; bool continueTriggering = false; - Creature* Advisor; for (uint8 i = 0; i < MAX_ADVISORS; ++i) if (Advisors[i]) { - Advisor = (Unit::GetCreature(*me, Advisors[i])); - if (Advisor && Advisor->IsAlive()) + Creature* advisor = ObjectAccessor::GetCreature(*me, Advisors[i]); + if (advisor && advisor->IsAlive()) { continueTriggering = true; break; @@ -333,11 +331,9 @@ public: pet = false; - Creature* Pet = Unit::GetCreature(*me, SummonedPet); + Creature* Pet = ObjectAccessor::GetCreature(*me, SummonedPet); if (Pet && Pet->IsAlive()) - { Pet->DealDamage(Pet, Pet->GetHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false); - } SummonedPet = 0; @@ -346,7 +342,7 @@ public: void JustDied(Unit* /*killer*/) OVERRIDE { - if (Creature* Karathress = (Unit::GetCreature((*me), instance->GetData64(DATA_KARATHRESS)))) + if (Creature* Karathress = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_KARATHRESS))) CAST_AI(boss_fathomlord_karathress::boss_fathomlord_karathressAI, Karathress->AI())->EventSharkkisDeath(); } @@ -359,7 +355,7 @@ public: void UpdateAI(uint32 diff) OVERRIDE { //Only if not incombat check if the event is started - if (!me->IsInCombat() && instance && instance->GetData(DATA_KARATHRESSEVENT)) + if (!me->IsInCombat() && instance->GetData(DATA_KARATHRESSEVENT)) { if (Unit* target = Unit::GetUnit(*me, instance->GetData64(DATA_KARATHRESSEVENT_STARTER))) AttackStart(target); @@ -370,7 +366,7 @@ public: return; //someone evaded! - if (instance && !instance->GetData(DATA_KARATHRESSEVENT)) + if (!instance->GetData(DATA_KARATHRESSEVENT)) { EnterEvadeMode(); return; @@ -394,11 +390,11 @@ public: if (TheBeastWithin_Timer <= diff) { DoCast(me, SPELL_THE_BEAST_WITHIN); - Creature* Pet = Unit::GetCreature(*me, SummonedPet); + + Creature* Pet = ObjectAccessor::GetCreature(*me, SummonedPet); if (Pet && Pet->IsAlive()) - { Pet->CastSpell(Pet, SPELL_PET_ENRAGE, true); - } + TheBeastWithin_Timer = 30000; } else TheBeastWithin_Timer -= diff; @@ -472,7 +468,7 @@ public: void JustDied(Unit* /*killer*/) OVERRIDE { - if (Creature* Karathress = Unit::GetCreature((*me), instance->GetData64(DATA_KARATHRESS))) + if (Creature* Karathress = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_KARATHRESS))) CAST_AI(boss_fathomlord_karathress::boss_fathomlord_karathressAI, Karathress->AI())->EventTidalvessDeath(); } @@ -486,7 +482,7 @@ public: void UpdateAI(uint32 diff) OVERRIDE { //Only if not incombat check if the event is started - if (!me->IsInCombat() && instance && instance->GetData(DATA_KARATHRESSEVENT)) + if (!me->IsInCombat() && instance->GetData(DATA_KARATHRESSEVENT)) { if (Unit* target = Unit::GetUnit(*me, instance->GetData64(DATA_KARATHRESSEVENT_STARTER))) AttackStart(target); @@ -497,7 +493,7 @@ public: return; //someone evaded! - if (instance && !instance->GetData(DATA_KARATHRESSEVENT)) + if (!instance->GetData(DATA_KARATHRESSEVENT)) { EnterEvadeMode(); return; @@ -588,7 +584,7 @@ public: void JustDied(Unit* /*killer*/) OVERRIDE { - if (Creature* Karathress = Unit::GetCreature((*me), instance->GetData64(DATA_KARATHRESS))) + if (Creature* Karathress = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_KARATHRESS))) CAST_AI(boss_fathomlord_karathress::boss_fathomlord_karathressAI, Karathress->AI())->EventCaribdisDeath(); } @@ -601,7 +597,7 @@ public: void UpdateAI(uint32 diff) OVERRIDE { //Only if not incombat check if the event is started - if (!me->IsInCombat() && instance && instance->GetData(DATA_KARATHRESSEVENT)) + if (!me->IsInCombat() && instance->GetData(DATA_KARATHRESSEVENT)) { if (Unit* target = Unit::GetUnit(*me, instance->GetData64(DATA_KARATHRESSEVENT_STARTER))) AttackStart(target); @@ -612,7 +608,7 @@ public: return; //someone evaded! - if (instance && !instance->GetData(DATA_KARATHRESSEVENT)) + if (!instance->GetData(DATA_KARATHRESSEVENT)) { EnterEvadeMode(); return; diff --git a/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_lady_vashj.cpp b/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_lady_vashj.cpp index b421d9c1153..8d6eb064194 100644 --- a/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_lady_vashj.cpp +++ b/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_lady_vashj.cpp @@ -519,7 +519,7 @@ public: if (CheckTimer <= diff) { // Start Phase 3 - if (instance && instance->GetData(DATA_CANSTARTPHASE3)) + if (instance->GetData(DATA_CANSTARTPHASE3)) { // set life 50% me->SetHealth(me->CountPctFromMaxHealth(50)); diff --git a/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_leotheras_the_blind.cpp b/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_leotheras_the_blind.cpp index a45e4ddb0a9..f9370b44c20 100644 --- a/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_leotheras_the_blind.cpp +++ b/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_leotheras_the_blind.cpp @@ -317,10 +317,10 @@ public: // and reseting equipment me->LoadEquipment(); - if (instance && instance->GetData64(DATA_LEOTHERAS_EVENT_STARTER)) + if (instance->GetData64(DATA_LEOTHERAS_EVENT_STARTER)) { Unit* victim = NULL; - victim = Unit::GetUnit(*me, instance->GetData64(DATA_LEOTHERAS_EVENT_STARTER)); + victim = ObjectAccessor::GetUnit(*me, instance->GetData64(DATA_LEOTHERAS_EVENT_STARTER)); if (victim) me->getThreatManager().addThreat(victim, 1); StartEvent(); @@ -750,7 +750,7 @@ public: return; } - if (instance && !instance->GetData64(DATA_LEOTHERAS_EVENT_STARTER)) + if (!instance->GetData64(DATA_LEOTHERAS_EVENT_STARTER)) { EnterEvadeMode(); return; 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 a6cd426f435..718c32cd8ae 100644 --- a/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_lurker_below.cpp +++ b/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_lurker_below.cpp @@ -112,10 +112,11 @@ public: bool CheckCanStart()//check if players fished { - if (instance && instance->GetData(DATA_STRANGE_POOL) == NOT_STARTED) + if (instance->GetData(DATA_STRANGE_POOL) == NOT_STARTED) return false; return true; } + void Reset() OVERRIDE { me->SetSwim(true); diff --git a/src/server/scripts/Outland/CoilfangReservoir/SteamVault/boss_mekgineer_steamrigger.cpp b/src/server/scripts/Outland/CoilfangReservoir/SteamVault/boss_mekgineer_steamrigger.cpp index 42833fead04..3661ebc8cc3 100644 --- a/src/server/scripts/Outland/CoilfangReservoir/SteamVault/boss_mekgineer_steamrigger.cpp +++ b/src/server/scripts/Outland/CoilfangReservoir/SteamVault/boss_mekgineer_steamrigger.cpp @@ -224,11 +224,11 @@ public: { if (Repair_Timer <= diff) { - if (instance && instance->GetBossState(DATA_MEKGINEER_STEAMRIGGER) == IN_PROGRESS) + if (instance->GetBossState(DATA_MEKGINEER_STEAMRIGGER) == IN_PROGRESS) { - if (Unit* pMekgineer = Unit::GetUnit(*me, instance->GetData64(DATA_MEKGINEER_STEAMRIGGER))) + if (Creature* mekgineer = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_MEKGINEER_STEAMRIGGER))) { - if (me->IsWithinDistInMap(pMekgineer, MAX_REPAIR_RANGE)) + if (me->IsWithinDistInMap(mekgineer, MAX_REPAIR_RANGE)) { //are we already channeling? Doesn't work very well, find better check? if (!me->GetUInt32Value(UNIT_CHANNEL_SPELL)) diff --git a/src/server/scripts/Outland/HellfireCitadel/BloodFurnace/blood_furnace.h b/src/server/scripts/Outland/HellfireCitadel/BloodFurnace/blood_furnace.h index 193b0be51b0..b2097c34b33 100644 --- a/src/server/scripts/Outland/HellfireCitadel/BloodFurnace/blood_furnace.h +++ b/src/server/scripts/Outland/HellfireCitadel/BloodFurnace/blood_furnace.h @@ -1,6 +1,5 @@ /* * Copyright (C) 2008-2014 TrinityCore <http://www.trinitycore.org/> - * Copyright (C) 2006-2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/> * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the @@ -16,32 +15,59 @@ * with this program. If not, see <http://www.gnu.org/licenses/>. */ -#ifndef DEF_BLOOD_FURNACE_H -#define DEF_BLOOD_FURNACE_H +#ifndef BLOOD_FURNACE_H_ +#define BLOOD_FURNACE_H_ + +#define BFScriptName "instance_blood_furnace" +uint32 const EncounterCount = 3; enum DataTypes { - DATA_THE_MAKER = 1, - DATA_BROGGOK = 2, - DATA_KELIDAN_THE_MAKER = 3, - TYPE_THE_MAKER_EVENT = 4, - TYPE_BROGGOK_EVENT = 5, - TYPE_KELIDAN_THE_BREAKER_EVENT = 6, - DATA_DOOR1 = 7, - DATA_DOOR2 = 8, - DATA_DOOR3 = 9, - DATA_DOOR4 = 10, - DATA_DOOR5 = 11, - DATA_DOOR6 = 12, - DATA_PRISON_CELL1 = 13, - DATA_PRISON_CELL2 = 14, - DATA_PRISON_CELL3 = 15, - DATA_PRISON_CELL4 = 16, - DATA_PRISON_CELL5 = 17, - DATA_PRISON_CELL6 = 18, - DATA_PRISON_CELL7 = 19, - DATA_PRISON_CELL8 = 20, - DATA_BROGGOK_LEVER = 21 + // Encounter States/Boss GUIDs + DATA_THE_MAKER = 0, + DATA_BROGGOK = 1, + DATA_KELIDAN_THE_BREAKER = 2, + + // Additional Data + DATA_DOOR_4 = 3, + DATA_PRISON_CELL1 = 4, + DATA_PRISON_CELL2 = 5, + DATA_PRISON_CELL3 = 6, + DATA_PRISON_CELL4 = 7, + DATA_PRISON_CELL5 = 8, + DATA_PRISON_CELL6 = 9, + DATA_PRISON_CELL7 = 10, + DATA_PRISON_CELL8 = 11, + DATA_BROGGOK_LEVER = 12 +}; + +enum CreatureIds +{ + NPC_THE_MAKER = 17381, + NPC_BROGGOK = 17380, + NPC_KELIDAN_THE_BREAKER = 17377, + NPC_PRISONER = 17398 +}; + +enum GameObjectIds +{ + GO_PRISON_DOOR_01 = 181766, // Final Exit Door + GO_PRISON_DOOR_02 = 181811, // The Maker Front Door + GO_PRISON_DOOR_03 = 181812, // The Maker Rear Door + GO_PRISON_DOOR_04 = 181819, // Broggok Rear Door + GO_PRISON_DOOR_05 = 181822, // Broggok Front Door + GO_SUMMON_DOOR = 181823, // Kelidan Exit Door + + GO_PRISON_CELL_DOOR_1 = 181813, // The Maker Prison Cell front right + GO_PRISON_CELL_DOOR_2 = 181814, // The Maker Prison Cell back right + GO_PRISON_CELL_DOOR_3 = 181816, // The Maker Prison Cell front left + GO_PRISON_CELL_DOOR_4 = 181815, // The Maker Prison Cell back left + GO_PRISON_CELL_DOOR_5 = 181821, // Broggok Prison Cell front right + GO_PRISON_CELL_DOOR_6 = 181818, // Broggok Prison Cell back right + GO_PRISON_CELL_DOOR_7 = 181820, // Broggok Prison Cell front left + GO_PRISON_CELL_DOOR_8 = 181817, // Broggok Prison Cell back left + + GO_BROGGOK_LEVER = 181982 }; enum ActionIds @@ -51,5 +77,11 @@ enum ActionIds ACTION_PREPARE_BROGGOK = 3 }; -#endif +template<class AI> +AI* GetBloodFurnaceAI(Creature* creature) +{ + return GetInstanceAI<AI>(creature, BFScriptName); +} + +#endif // BLOOD_FURNACE_H_ diff --git a/src/server/scripts/Outland/HellfireCitadel/BloodFurnace/boss_broggok.cpp b/src/server/scripts/Outland/HellfireCitadel/BloodFurnace/boss_broggok.cpp index 1dda4161b8c..f610d6dd7e0 100644 --- a/src/server/scripts/Outland/HellfireCitadel/BloodFurnace/boss_broggok.cpp +++ b/src/server/scripts/Outland/HellfireCitadel/BloodFurnace/boss_broggok.cpp @@ -25,39 +25,32 @@ EndScriptData */ #include "ScriptMgr.h" #include "ScriptedCreature.h" +#include "SpellScript.h" +#include "SpellAuraEffects.h" #include "blood_furnace.h" enum Yells { - SAY_AGGRO = 0 + SAY_AGGRO = 0 }; enum Spells { - SPELL_SLIME_SPRAY = 30913, - SPELL_POISON_CLOUD = 30916, - SPELL_POISON_BOLT = 30917, + SPELL_SLIME_SPRAY = 30913, + SPELL_POISON_CLOUD = 30916, + SPELL_POISON_BOLT = 30917, - SPELL_POISON = 30914 + SPELL_POISON_CLOUD_PASSIVE = 30914 }; class boss_broggok : public CreatureScript { public: - - boss_broggok() - : CreatureScript("boss_broggok") - { - } + boss_broggok() : CreatureScript("boss_broggok") { } struct boss_broggokAI : public BossAI { - boss_broggokAI(Creature* creature) : BossAI(creature, DATA_BROGGOK) - { - instance = creature->GetInstanceScript(); - } - - InstanceScript* instance; + boss_broggokAI(Creature* creature) : BossAI(creature, DATA_BROGGOK) { } uint32 AcidSpray_Timer; uint32 PoisonSpawn_Timer; @@ -71,28 +64,22 @@ class boss_broggok : public CreatureScript PoisonSpawn_Timer = 5000; PoisonBolt_Timer = 7000; DoAction(ACTION_RESET_BROGGOK); - instance->SetData(TYPE_BROGGOK_EVENT, NOT_STARTED); } void EnterCombat(Unit* /*who*/) OVERRIDE { + _EnterCombat(); Talk(SAY_AGGRO); } - void JustSummoned(Creature* summoned) OVERRIDE - { - summoned->setFaction(16); - summoned->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); - summoned->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); - summoned->CastSpell(summoned, SPELL_POISON, false, 0, 0, me->GetGUID()); - } - void UpdateAI(uint32 diff) OVERRIDE { if (!UpdateVictim()) return; + if (!canAttack) return; + if (AcidSpray_Timer <= diff) { DoCastVictim(SPELL_SLIME_SPRAY); @@ -122,9 +109,7 @@ class boss_broggok : public CreatureScript void JustDied(Unit* /*killer*/) OVERRIDE { - instance->HandleGameObject(instance->GetData64(DATA_DOOR4), true); - instance->HandleGameObject(instance->GetData64(DATA_DOOR5), true); - instance->SetData(TYPE_BROGGOK_EVENT, DONE); + _JustDied(); } void DoAction(int32 action) OVERRIDE @@ -151,7 +136,34 @@ class boss_broggok : public CreatureScript CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return GetInstanceAI<boss_broggokAI>(creature); + return GetBloodFurnaceAI<boss_broggokAI>(creature); + } +}; + +class npc_broggok_poison_cloud : public CreatureScript +{ + public: + npc_broggok_poison_cloud() : CreatureScript("npc_broggok_poison_cloud") { } + + struct npc_broggok_poison_cloudAI : public ScriptedAI + { + npc_broggok_poison_cloudAI(Creature* creature) : ScriptedAI(creature) + { + SetCombatMovement(false); + creature->SetReactState(REACT_PASSIVE); + } + + void IsSummonedBy(Unit* /*summoner*/) OVERRIDE + { + DoCast(me, SPELL_POISON_CLOUD_PASSIVE, true); + } + + void UpdateAI(uint32 /*diff*/) OVERRIDE { } + }; + + CreatureAI* GetAI(Creature* creature) const OVERRIDE + { + return new npc_broggok_poison_cloudAI(creature); } }; @@ -163,19 +175,60 @@ class go_broggok_lever : public GameObjectScript bool OnGossipHello(Player* /*player*/, GameObject* go) OVERRIDE { if (InstanceScript* instance = go->GetInstanceScript()) - if (instance->GetData(TYPE_BROGGOK_EVENT) != DONE && instance->GetData(TYPE_BROGGOK_EVENT) != IN_PROGRESS) + if (instance->GetBossState(DATA_BROGGOK) != DONE && instance->GetBossState(DATA_BROGGOK) != IN_PROGRESS) { - instance->SetData(TYPE_BROGGOK_EVENT, IN_PROGRESS); - if (Creature* broggok = Creature::GetCreature(*go, instance->GetData64(DATA_BROGGOK))) + instance->SetBossState(DATA_BROGGOK, IN_PROGRESS); + if (Creature* broggok = ObjectAccessor::GetCreature(*go, instance->GetData64(DATA_BROGGOK))) broggok->AI()->DoAction(ACTION_PREPARE_BROGGOK); } + go->UseDoorOrButton(); return false; } }; +// 30914, 38462 - Poison (Broggok) +class spell_broggok_poison_cloud : public SpellScriptLoader +{ + public: + spell_broggok_poison_cloud() : SpellScriptLoader("spell_broggok_poison_cloud") { } + + class spell_broggok_poison_cloud_AuraScript : public AuraScript + { + PrepareAuraScript(spell_broggok_poison_cloud_AuraScript); + + bool Validate(SpellInfo const* spellInfo) OVERRIDE + { + if (!sSpellMgr->GetSpellInfo(spellInfo->Effects[EFFECT_0].TriggerSpell)) + return false; + return true; + } + + void PeriodicTick(AuraEffect const* aurEff) + { + PreventDefaultAction(); + + uint32 triggerSpell = GetSpellInfo()->Effects[aurEff->GetEffIndex()].TriggerSpell; + int32 mod = int32(((float(aurEff->GetTickNumber()) / aurEff->GetTotalTicks()) * 0.9f + 0.1f) * 10000 * 2 / 3); + GetTarget()->CastCustomSpell(triggerSpell, SPELLVALUE_RADIUS_MOD, mod, (Unit*)NULL, TRIGGERED_FULL_MASK, NULL, aurEff); + } + + void Register() OVERRIDE + { + OnEffectPeriodic += AuraEffectPeriodicFn(spell_broggok_poison_cloud_AuraScript::PeriodicTick, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL); + } + }; + + AuraScript* GetAuraScript() const OVERRIDE + { + return new spell_broggok_poison_cloud_AuraScript(); + } +}; + void AddSC_boss_broggok() { new boss_broggok(); + new npc_broggok_poison_cloud(); new go_broggok_lever(); + new spell_broggok_poison_cloud(); } diff --git a/src/server/scripts/Outland/HellfireCitadel/BloodFurnace/boss_kelidan_the_breaker.cpp b/src/server/scripts/Outland/HellfireCitadel/BloodFurnace/boss_kelidan_the_breaker.cpp index 78be2347656..4c04c06b091 100644 --- a/src/server/scripts/Outland/HellfireCitadel/BloodFurnace/boss_kelidan_the_breaker.cpp +++ b/src/server/scripts/Outland/HellfireCitadel/BloodFurnace/boss_kelidan_the_breaker.cpp @@ -16,18 +16,6 @@ * with this program. If not, see <http://www.gnu.org/licenses/>. */ -/* ScriptData -SDName: Boss_Kelidan_The_Breaker -SD%Complete: 100 -SDComment: -SDCategory: Hellfire Citadel, Blood Furnace -EndScriptData */ - -/* ContentData -boss_kelidan_the_breaker -npc_shadowmoon_channeler -EndContentData */ - #include "ScriptMgr.h" #include "ScriptedCreature.h" #include "SpellAuras.h" @@ -71,23 +59,16 @@ const float ShadowmoonChannelers[5][4]= class boss_kelidan_the_breaker : public CreatureScript { public: + boss_kelidan_the_breaker() : CreatureScript("boss_kelidan_the_breaker") { } - boss_kelidan_the_breaker() - : CreatureScript("boss_kelidan_the_breaker") - { - } - - struct boss_kelidan_the_breakerAI : public ScriptedAI + struct boss_kelidan_the_breakerAI : public BossAI { - boss_kelidan_the_breakerAI(Creature* creature) : ScriptedAI(creature) + boss_kelidan_the_breakerAI(Creature* creature) : BossAI(creature, DATA_KELIDAN_THE_BREAKER) { - instance = creature->GetInstanceScript(); - for (uint8 i=0; i<5; ++i) + for (uint8 i = 0; i < 5; ++i) Channelers[i] = 0; } - InstanceScript* instance; - uint32 ShadowVolley_Timer; uint32 BurningNova_Timer; uint32 Firenova_Timer; @@ -99,6 +80,7 @@ class boss_kelidan_the_breaker : public CreatureScript void Reset() OVERRIDE { + _Reset(); ShadowVolley_Timer = 1000; BurningNova_Timer = 15000; Corruption_Timer = 5000; @@ -108,16 +90,15 @@ class boss_kelidan_the_breaker : public CreatureScript SummonChannelers(); me->SetReactState(REACT_PASSIVE); me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC | UNIT_FLAG_IMMUNE_TO_NPC | UNIT_FLAG_NON_ATTACKABLE); - instance->SetData(TYPE_KELIDAN_THE_BREAKER_EVENT, NOT_STARTED); } void EnterCombat(Unit* who) OVERRIDE { + _EnterCombat(); Talk(SAY_WAKE); if (me->IsNonMeleeSpellCast(false)) me->InterruptNonMeleeSpells(true); DoStartMovement(who); - instance->SetData(TYPE_KELIDAN_THE_BREAKER_EVENT, IN_PROGRESS); } void KilledUnit(Unit* /*victim*/) OVERRIDE @@ -189,11 +170,8 @@ class boss_kelidan_the_breaker : public CreatureScript void JustDied(Unit* /*killer*/) OVERRIDE { + _JustDied(); Talk(SAY_DIE); - - instance->SetData(TYPE_KELIDAN_THE_BREAKER_EVENT, DONE); - instance->HandleGameObject(instance->GetData64(DATA_DOOR1), true); - instance->HandleGameObject(instance->GetData64(DATA_DOOR6), true); } void UpdateAI(uint32 diff) OVERRIDE @@ -270,7 +248,7 @@ class boss_kelidan_the_breaker : public CreatureScript CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return GetInstanceAI<boss_kelidan_the_breakerAI>(creature); + return GetBloodFurnaceAI<boss_kelidan_the_breakerAI>(creature); } }; @@ -368,7 +346,7 @@ class npc_shadowmoon_channeler : public CreatureScript CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return GetInstanceAI<npc_shadowmoon_channelerAI>(creature); + return GetBloodFurnaceAI<npc_shadowmoon_channelerAI>(creature); } }; diff --git a/src/server/scripts/Outland/HellfireCitadel/BloodFurnace/boss_the_maker.cpp b/src/server/scripts/Outland/HellfireCitadel/BloodFurnace/boss_the_maker.cpp index 214edf4f5c2..6ab356bfa4a 100644 --- a/src/server/scripts/Outland/HellfireCitadel/BloodFurnace/boss_the_maker.cpp +++ b/src/server/scripts/Outland/HellfireCitadel/BloodFurnace/boss_the_maker.cpp @@ -45,20 +45,11 @@ enum Spells class boss_the_maker : public CreatureScript { public: + boss_the_maker() : CreatureScript("boss_the_maker") { } - boss_the_maker() - : CreatureScript("boss_the_maker") + struct boss_the_makerAI : public BossAI { - } - - struct boss_the_makerAI : public ScriptedAI - { - boss_the_makerAI(Creature* creature) : ScriptedAI(creature) - { - instance = creature->GetInstanceScript(); - } - - InstanceScript* instance; + boss_the_makerAI(Creature* creature) : BossAI(creature, DATA_THE_MAKER) { } uint32 AcidSpray_Timer; uint32 ExplodingBreaker_Timer; @@ -67,37 +58,30 @@ class boss_the_maker : public CreatureScript void Reset() OVERRIDE { + _Reset(); AcidSpray_Timer = 15000; ExplodingBreaker_Timer = 6000; Domination_Timer = 120000; Knockdown_Timer = 10000; - - instance->SetData(TYPE_THE_MAKER_EVENT, NOT_STARTED); - instance->HandleGameObject(instance->GetData64(DATA_DOOR2), true); } void EnterCombat(Unit* /*who*/) OVERRIDE { + _EnterCombat(); Talk(SAY_AGGRO); - - instance->SetData(TYPE_THE_MAKER_EVENT, IN_PROGRESS); - instance->HandleGameObject(instance->GetData64(DATA_DOOR2), false); } - void KilledUnit(Unit* /*victim*/) OVERRIDE + void KilledUnit(Unit* who) OVERRIDE { - Talk(SAY_KILL); + if (who->GetTypeId() == TYPEID_PLAYER) + Talk(SAY_KILL); } void JustDied(Unit* /*killer*/) OVERRIDE { + _JustDied(); Talk(SAY_DIE); - - instance->SetData(TYPE_THE_MAKER_EVENT, DONE); - instance->HandleGameObject(instance->GetData64(DATA_DOOR2), true); - instance->HandleGameObject(instance->GetData64(DATA_DOOR3), true); - - } + } void UpdateAI(uint32 diff) OVERRIDE { @@ -147,7 +131,7 @@ class boss_the_maker : public CreatureScript CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return GetInstanceAI<boss_the_makerAI>(creature); + return GetBloodFurnaceAI<boss_the_makerAI>(creature); } }; diff --git a/src/server/scripts/Outland/HellfireCitadel/BloodFurnace/instance_blood_furnace.cpp b/src/server/scripts/Outland/HellfireCitadel/BloodFurnace/instance_blood_furnace.cpp index 7a9db8f4a63..bc399e4b43f 100644 --- a/src/server/scripts/Outland/HellfireCitadel/BloodFurnace/instance_blood_furnace.cpp +++ b/src/server/scripts/Outland/HellfireCitadel/BloodFurnace/instance_blood_furnace.cpp @@ -1,6 +1,5 @@ /* * Copyright (C) 2008-2014 TrinityCore <http://www.trinitycore.org/> - * Copyright (C) 2006-2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/> * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the @@ -16,292 +15,207 @@ * with this program. If not, see <http://www.gnu.org/licenses/>. */ -/* ScriptData -SDName: Instance_Blood_Furnace -SD%Complete: 85 -SDComment: -SDCategory: Hellfire Citadel, Blood Furnace -EndScriptData */ - #include "ScriptMgr.h" +#include "ScriptedCreature.h" #include "InstanceScript.h" #include "blood_furnace.h" -#include "CreatureAI.h" -#define ENTRY_SEWER1 181823 -#define ENTRY_SEWER2 181766 -#define MAX_ENCOUNTER 3 +DoorData const doorData[] = +{ + { GO_PRISON_DOOR_01, DATA_KELIDAN_THE_BREAKER, DOOR_TYPE_PASSAGE, BOUNDARY_NONE }, + { GO_PRISON_DOOR_02, DATA_THE_MAKER, DOOR_TYPE_ROOM, BOUNDARY_NONE }, + { GO_PRISON_DOOR_03, DATA_THE_MAKER, DOOR_TYPE_PASSAGE, BOUNDARY_NONE }, + { GO_PRISON_DOOR_04, DATA_BROGGOK, DOOR_TYPE_PASSAGE, BOUNDARY_NONE }, + { GO_PRISON_DOOR_05, DATA_BROGGOK, DOOR_TYPE_ROOM, BOUNDARY_NONE }, + { GO_SUMMON_DOOR, DATA_KELIDAN_THE_BREAKER, DOOR_TYPE_PASSAGE, BOUNDARY_NONE }, + { 0, 0, DOOR_TYPE_ROOM, BOUNDARY_NONE } // END +}; class instance_blood_furnace : public InstanceMapScript { public: - instance_blood_furnace() - : InstanceMapScript("instance_blood_furnace", 542) { } + instance_blood_furnace() : InstanceMapScript(BFScriptName, 542) { } struct instance_blood_furnace_InstanceMapScript : public InstanceScript { - instance_blood_furnace_InstanceMapScript(Map* map) : InstanceScript(map) { } - - uint64 The_MakerGUID; - uint64 BroggokGUID; - uint64 Kelidan_The_BreakerGUID; - - uint64 Door1GUID; - uint64 Door2GUID; - uint64 Door3GUID; - uint64 Door4GUID; - uint64 Door5GUID; - uint64 Door6GUID; - - uint64 PrisonCell1GUID; - uint64 PrisonCell2GUID; - uint64 PrisonCell3GUID; - uint64 PrisonCell4GUID; - uint64 PrisonCell5GUID; - uint64 PrisonCell6GUID; - uint64 PrisonCell7GUID; - uint64 PrisonCell8GUID; - - std::set<uint64> PrisonersCell5; - std::set<uint64> PrisonersCell6; - std::set<uint64> PrisonersCell7; - std::set<uint64> PrisonersCell8; - - uint8 PrisonerCounter5; - uint8 PrisonerCounter6; - uint8 PrisonerCounter7; - uint8 PrisonerCounter8; + instance_blood_furnace_InstanceMapScript(Map* map) : InstanceScript(map) + { + SetBossNumber(EncounterCount); + LoadDoorData(doorData); - uint64 BroggokLeverGUID; + TheMakerGUID = 0; + BroggokGUID = 0; + KelidanTheBreakerGUID = 0; - uint32 m_auiEncounter[MAX_ENCOUNTER]; - std::string str_data; + BroggokLeverGUID = 0; + PrisonDoor4GUID = 0; - void Initialize() OVERRIDE - { - memset(&m_auiEncounter, 0, sizeof(m_auiEncounter)); - - The_MakerGUID = 0; - BroggokGUID = 0; - Kelidan_The_BreakerGUID = 0; - - Door1GUID = 0; - Door2GUID = 0; - Door3GUID = 0; - Door4GUID = 0; - Door5GUID = 0; - Door6GUID = 0; - - PrisonCell1GUID = 0; - PrisonCell2GUID = 0; - PrisonCell3GUID = 0; - PrisonCell4GUID = 0; - PrisonCell5GUID = 0; - PrisonCell6GUID = 0; - PrisonCell7GUID = 0; - PrisonCell8GUID = 0; + memset(PrisonCellGUIDs, 0, 8 * sizeof(uint64)); PrisonersCell5.clear(); PrisonersCell6.clear(); PrisonersCell7.clear(); PrisonersCell8.clear(); - PrisonerCounter5 = 0; - PrisonerCounter6 = 0; - PrisonerCounter7 = 0; - PrisonerCounter8 = 0; - - BroggokLeverGUID = 0; + PrisonerCounter5 = 0; + PrisonerCounter6 = 0; + PrisonerCounter7 = 0; + PrisonerCounter8 = 0; } void OnCreatureCreate(Creature* creature) OVERRIDE { switch (creature->GetEntry()) { - case 17381: - The_MakerGUID = creature->GetGUID(); + case NPC_THE_MAKER: + TheMakerGUID = creature->GetGUID(); break; - case 17380: + case NPC_BROGGOK: BroggokGUID = creature->GetGUID(); break; - case 17377: - Kelidan_The_BreakerGUID = creature->GetGUID(); + case NPC_KELIDAN_THE_BREAKER: + KelidanTheBreakerGUID = creature->GetGUID(); break; - case 17398: + case NPC_PRISONER: StorePrisoner(creature); break; + default: + break; } } void OnUnitDeath(Unit* unit) OVERRIDE { - if (unit && unit->GetTypeId() == TYPEID_UNIT && unit->GetEntry() == 17398) + if (unit->GetTypeId() == TYPEID_UNIT && unit->GetEntry() == NPC_PRISONER) PrisonerDied(unit->GetGUID()); } void OnGameObjectCreate(GameObject* go) OVERRIDE { - if (go->GetEntry() == 181766) //Final exit door - Door1GUID = go->GetGUID(); - if (go->GetEntry() == 181811) //The Maker Front door - Door2GUID = go->GetGUID(); - if (go->GetEntry() == 181812) //The Maker Rear door - Door3GUID = go->GetGUID(); - if (go->GetEntry() == 181822) //Broggok Front door - Door4GUID = go->GetGUID(); - if (go->GetEntry() == 181819) //Broggok Rear door - Door5GUID = go->GetGUID(); - if (go->GetEntry() == 181823) //Kelidan exit door - Door6GUID = go->GetGUID(); - - if (go->GetEntry() == 181813) //The Maker prison cell front right - PrisonCell1GUID = go->GetGUID(); - if (go->GetEntry() == 181814) //The Maker prison cell back right - PrisonCell2GUID = go->GetGUID(); - if (go->GetEntry() == 181816) //The Maker prison cell front left - PrisonCell3GUID = go->GetGUID(); - if (go->GetEntry() == 181815) //The Maker prison cell back left - PrisonCell4GUID = go->GetGUID(); - if (go->GetEntry() == 181821) //Broggok prison cell front right - PrisonCell5GUID = go->GetGUID(); - if (go->GetEntry() == 181818) //Broggok prison cell back right - PrisonCell6GUID = go->GetGUID(); - if (go->GetEntry() == 181820) //Broggok prison cell front left - PrisonCell7GUID = go->GetGUID(); - if (go->GetEntry() == 181817) //Broggok prison cell back left - PrisonCell8GUID = go->GetGUID(); - - if (go->GetEntry() == 181982) - BroggokLeverGUID = go->GetGUID(); //Broggok lever - } - - uint64 GetData64(uint32 data) const OVERRIDE - { - switch (data) + switch (go->GetEntry()) { - case DATA_THE_MAKER: return The_MakerGUID; - case DATA_BROGGOK: return BroggokGUID; - case DATA_KELIDAN_THE_MAKER: return Kelidan_The_BreakerGUID; - case DATA_DOOR1: return Door1GUID; - case DATA_DOOR2: return Door2GUID; - case DATA_DOOR3: return Door3GUID; - case DATA_DOOR4: return Door4GUID; - case DATA_DOOR5: return Door5GUID; - case DATA_DOOR6: return Door6GUID; - case DATA_PRISON_CELL1: return PrisonCell1GUID; - case DATA_PRISON_CELL2: return PrisonCell2GUID; - case DATA_PRISON_CELL3: return PrisonCell3GUID; - case DATA_PRISON_CELL4: return PrisonCell4GUID; - case DATA_PRISON_CELL5: return PrisonCell5GUID; - case DATA_PRISON_CELL6: return PrisonCell6GUID; - case DATA_PRISON_CELL7: return PrisonCell7GUID; - case DATA_PRISON_CELL8: return PrisonCell8GUID; - case DATA_BROGGOK_LEVER: return BroggokLeverGUID; + case GO_PRISON_DOOR_04: + PrisonDoor4GUID = go->GetGUID(); + // no break + case GO_PRISON_DOOR_01: + case GO_PRISON_DOOR_02: + case GO_PRISON_DOOR_03: + case GO_PRISON_DOOR_05: + case GO_SUMMON_DOOR: + AddDoor(go, true); + break; + case GO_BROGGOK_LEVER: + BroggokLeverGUID = go->GetGUID(); + break; + case GO_PRISON_CELL_DOOR_1: + PrisonCellGUIDs[DATA_PRISON_CELL1 - DATA_PRISON_CELL1] = go->GetGUID(); + break; + case GO_PRISON_CELL_DOOR_2: + PrisonCellGUIDs[DATA_PRISON_CELL2 - DATA_PRISON_CELL1] = go->GetGUID(); + break; + case GO_PRISON_CELL_DOOR_3: + PrisonCellGUIDs[DATA_PRISON_CELL3 - DATA_PRISON_CELL1] = go->GetGUID(); + break; + case GO_PRISON_CELL_DOOR_4: + PrisonCellGUIDs[DATA_PRISON_CELL4 - DATA_PRISON_CELL1] = go->GetGUID(); + break; + case GO_PRISON_CELL_DOOR_5: + PrisonCellGUIDs[DATA_PRISON_CELL5 - DATA_PRISON_CELL1] = go->GetGUID(); + break; + case GO_PRISON_CELL_DOOR_6: + PrisonCellGUIDs[DATA_PRISON_CELL6 - DATA_PRISON_CELL1] = go->GetGUID(); + break; + case GO_PRISON_CELL_DOOR_7: + PrisonCellGUIDs[DATA_PRISON_CELL7 - DATA_PRISON_CELL1] = go->GetGUID(); + break; + case GO_PRISON_CELL_DOOR_8: + PrisonCellGUIDs[DATA_PRISON_CELL8 - DATA_PRISON_CELL1] = go->GetGUID(); + break; + default: + break; } - return 0; } - void SetData(uint32 type, uint32 data) OVERRIDE + void OnGameObjectRemove(GameObject* go) OVERRIDE { - switch (type) - { - case TYPE_THE_MAKER_EVENT: - m_auiEncounter[0] = data; - break; - case TYPE_BROGGOK_EVENT: - m_auiEncounter[1] = data; - UpdateBroggokEvent(data); - break; - case TYPE_KELIDAN_THE_BREAKER_EVENT: - m_auiEncounter[2] = data; - break; - } - - if (data == DONE) + switch (go->GetEntry()) { - OUT_SAVE_INST_DATA; - - std::ostringstream saveStream; - saveStream << m_auiEncounter[0] << ' ' << m_auiEncounter[1] << ' ' << m_auiEncounter[2]; - - str_data = saveStream.str(); - - SaveToDB(); - OUT_SAVE_INST_DATA_COMPLETE; + case GO_PRISON_DOOR_01: + case GO_PRISON_DOOR_02: + case GO_PRISON_DOOR_03: + case GO_PRISON_DOOR_04: + case GO_PRISON_DOOR_05: + case GO_SUMMON_DOOR: + AddDoor(go, false); + break; + default: + break; } } - uint32 GetData(uint32 type) const OVERRIDE + uint64 GetData64(uint32 type) const OVERRIDE { switch (type) { - case TYPE_THE_MAKER_EVENT: return m_auiEncounter[0]; - case TYPE_BROGGOK_EVENT: return m_auiEncounter[1]; - case TYPE_KELIDAN_THE_BREAKER_EVENT: return m_auiEncounter[2]; + case DATA_THE_MAKER: + return TheMakerGUID; + case DATA_BROGGOK: + return BroggokGUID; + case DATA_KELIDAN_THE_BREAKER: + return KelidanTheBreakerGUID; + case DATA_BROGGOK_LEVER: + return BroggokLeverGUID; } - return 0; - } - const char* Save() - { - return str_data.c_str(); + return 0; } - void Load(const char* in) OVERRIDE + bool SetBossState(uint32 type, EncounterState state) OVERRIDE { - if (!in) - { - OUT_LOAD_INST_DATA_FAIL; - return; - } - - OUT_LOAD_INST_DATA(in); + if (!InstanceScript::SetBossState(type, state)) + return false; - std::istringstream loadStream(in); - loadStream >> m_auiEncounter[0] >> m_auiEncounter[1] >> m_auiEncounter[2]; - - for (uint8 i = 0; i < MAX_ENCOUNTER; ++i) - if (m_auiEncounter[i] == IN_PROGRESS || m_auiEncounter[i] == FAIL) - m_auiEncounter[i] = NOT_STARTED; - - OUT_LOAD_INST_DATA_COMPLETE; - } - - void UpdateBroggokEvent(uint32 data) - { - switch (data) + switch (type) { - case IN_PROGRESS: - ActivateCell(DATA_PRISON_CELL5); - HandleGameObject(Door4GUID, false); + case DATA_BROGGOK: + switch (state) + { + case IN_PROGRESS: + ActivateCell(DATA_PRISON_CELL5); + break; + case NOT_STARTED: + ResetPrisons(); + if (GameObject* lever = instance->GetGameObject(BroggokLeverGUID)) + lever->Respawn(); + break; + default: + break; + } break; - case NOT_STARTED: - ResetPrisons(); - HandleGameObject(Door5GUID, false); - HandleGameObject(Door4GUID, true); - if (GameObject* lever = instance->GetGameObject(BroggokLeverGUID)) - lever->Respawn(); + default: break; } + + return true; } void ResetPrisons() { PrisonerCounter5 = PrisonersCell5.size(); ResetPrisoners(PrisonersCell5); - HandleGameObject(PrisonCell5GUID, false); + HandleGameObject(PrisonCellGUIDs[DATA_PRISON_CELL5 - DATA_PRISON_CELL1], false); PrisonerCounter6 = PrisonersCell6.size(); ResetPrisoners(PrisonersCell6); - HandleGameObject(PrisonCell6GUID, false); + HandleGameObject(PrisonCellGUIDs[DATA_PRISON_CELL6 - DATA_PRISON_CELL1], false); PrisonerCounter7 = PrisonersCell7.size(); ResetPrisoners(PrisonersCell7); - HandleGameObject(PrisonCell7GUID, false); + HandleGameObject(PrisonCellGUIDs[DATA_PRISON_CELL7 - DATA_PRISON_CELL1], false); PrisonerCounter8 = PrisonersCell8.size(); ResetPrisoners(PrisonersCell8); - HandleGameObject(PrisonCell8GUID, false); + HandleGameObject(PrisonCellGUIDs[DATA_PRISON_CELL8 - DATA_PRISON_CELL1], false); } void ResetPrisoners(const std::set<uint64>& prisoners) @@ -367,7 +281,7 @@ class instance_blood_furnace : public InstanceMapScript else if (PrisonersCell7.find(guid) != PrisonersCell7.end() && --PrisonerCounter7 <= 0) ActivateCell(DATA_PRISON_CELL8); else if (PrisonersCell8.find(guid) != PrisonersCell8.end() && --PrisonerCounter8 <= 0) - ActivateCell(DATA_DOOR5); + ActivateCell(DATA_DOOR_4); } void ActivateCell(uint8 id) @@ -375,30 +289,30 @@ class instance_blood_furnace : public InstanceMapScript switch (id) { case DATA_PRISON_CELL5: - HandleGameObject(PrisonCell5GUID, true); + HandleGameObject(PrisonCellGUIDs[id - DATA_PRISON_CELL1], true); ActivatePrisoners(PrisonersCell5); break; case DATA_PRISON_CELL6: - HandleGameObject(PrisonCell6GUID, true); + HandleGameObject(PrisonCellGUIDs[id - DATA_PRISON_CELL1], true); ActivatePrisoners(PrisonersCell6); break; case DATA_PRISON_CELL7: - HandleGameObject(PrisonCell7GUID, true); + HandleGameObject(PrisonCellGUIDs[id - DATA_PRISON_CELL1], true); ActivatePrisoners(PrisonersCell7); break; case DATA_PRISON_CELL8: - HandleGameObject(PrisonCell8GUID, true); + HandleGameObject(PrisonCellGUIDs[id - DATA_PRISON_CELL1], true); ActivatePrisoners(PrisonersCell8); break; - case DATA_DOOR5: - HandleGameObject(Door5GUID, true); + case DATA_DOOR_4: + HandleGameObject(PrisonDoor4GUID, true); if (Creature* broggok = instance->GetCreature(BroggokGUID)) broggok->AI()->DoAction(ACTION_ACTIVATE_BROGGOK); break; } } - void ActivatePrisoners(const std::set<uint64>& prisoners) + void ActivatePrisoners(std::set<uint64> const& prisoners) { for (std::set<uint64>::const_iterator i = prisoners.begin(); i != prisoners.end(); ++i) if (Creature* prisoner = instance->GetCreature(*i)) @@ -407,6 +321,69 @@ class instance_blood_furnace : public InstanceMapScript prisoner->SetInCombatWithZone(); } } + + std::string GetSaveData() OVERRIDE + { + OUT_SAVE_INST_DATA; + + std::ostringstream saveStream; + saveStream << "B F " << GetBossSaveData(); + + OUT_SAVE_INST_DATA_COMPLETE; + return saveStream.str(); + } + + void Load(char const* str) OVERRIDE + { + if (!str) + { + OUT_LOAD_INST_DATA_FAIL; + return; + } + + OUT_LOAD_INST_DATA(str); + + char dataHead1, dataHead2; + + std::istringstream loadStream(str); + loadStream >> dataHead1 >> dataHead2; + + if (dataHead1 == 'B' && dataHead2 == 'F') + { + for (uint32 i = 0; i < EncounterCount; ++i) + { + uint32 tmpState; + loadStream >> tmpState; + if (tmpState == IN_PROGRESS || tmpState > SPECIAL) + tmpState = NOT_STARTED; + SetBossState(i, EncounterState(tmpState)); + } + } + else + OUT_LOAD_INST_DATA_FAIL; + + OUT_LOAD_INST_DATA_COMPLETE; + } + + protected: + uint64 TheMakerGUID; + uint64 BroggokGUID; + uint64 KelidanTheBreakerGUID; + + uint64 BroggokLeverGUID; + uint64 PrisonDoor4GUID; + + uint64 PrisonCellGUIDs[8]; + + std::set<uint64>PrisonersCell5; + std::set<uint64>PrisonersCell6; + std::set<uint64>PrisonersCell7; + std::set<uint64>PrisonersCell8; + + uint8 PrisonerCounter5; + uint8 PrisonerCounter6; + uint8 PrisonerCounter7; + uint8 PrisonerCounter8; }; InstanceScript* GetInstanceScript(InstanceMap* map) const OVERRIDE diff --git a/src/server/scripts/Outland/TempestKeep/Eye/boss_alar.cpp b/src/server/scripts/Outland/TempestKeep/Eye/boss_alar.cpp index d802e48f3b0..a961800025d 100644 --- a/src/server/scripts/Outland/TempestKeep/Eye/boss_alar.cpp +++ b/src/server/scripts/Outland/TempestKeep/Eye/boss_alar.cpp @@ -484,7 +484,7 @@ class npc_ember_of_alar : public CreatureScript me->setDeathState(JUST_DIED); } - void DamageTaken(Unit* killer, uint32 &damage) OVERRIDE + void DamageTaken(Unit* killer, uint32& damage) OVERRIDE { if (damage >= me->GetHealth() && killer != me && !toDie) { @@ -492,7 +492,7 @@ class npc_ember_of_alar : public CreatureScript DoCast(me, SPELL_EMBER_BLAST, true); me->SetDisplayId(11686); me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); - if (instance && instance->GetData(DATA_ALAREVENT) == 2) + if (instance->GetData(DATA_ALAREVENT) == 2) { if (Unit* Alar = Unit::GetUnit(*me, instance->GetData64(DATA_ALAR))) { diff --git a/src/server/scripts/Outland/TempestKeep/Eye/boss_kaelthas.cpp b/src/server/scripts/Outland/TempestKeep/Eye/boss_kaelthas.cpp index 75b1bfe8ad1..077539b6b88 100644 --- a/src/server/scripts/Outland/TempestKeep/Eye/boss_kaelthas.cpp +++ b/src/server/scripts/Outland/TempestKeep/Eye/boss_kaelthas.cpp @@ -182,7 +182,7 @@ struct advisorbase_ai : public ScriptedAI me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); //reset encounter - if (instance && (instance->GetData(DATA_KAELTHASEVENT) == 1 || instance->GetData(DATA_KAELTHASEVENT) == 3)) + if (instance->GetData(DATA_KAELTHASEVENT) == 1 || instance->GetData(DATA_KAELTHASEVENT) == 3) if (Creature* Kaelthas = Unit::GetCreature(*me, instance->GetData64(DATA_KAELTHAS))) Kaelthas->AI()->EnterEvadeMode(); } @@ -223,14 +223,14 @@ struct advisorbase_ai : public ScriptedAI return; //Prevent glitch if in fake death - if (FakeDeath && instance && instance->GetData(DATA_KAELTHASEVENT) != 0) + if (FakeDeath && instance->GetData(DATA_KAELTHASEVENT) != 0) { damage = 0; return; } //Don't really die in phase 1 & 3, only die after that - if (instance && instance->GetData(DATA_KAELTHASEVENT) != 0) + if (instance->GetData(DATA_KAELTHASEVENT) != 0) { //prevent death damage = 0; @@ -417,7 +417,7 @@ class boss_kaelthas : public CreatureScript } else if (me->GetMap()->IsDungeon()) { - if (instance && !instance->GetData(DATA_KAELTHASEVENT) && !Phase) + if (!instance->GetData(DATA_KAELTHASEVENT) && !Phase) StartEvent(); who->SetInCombatWith(me); @@ -429,7 +429,7 @@ class boss_kaelthas : public CreatureScript void EnterCombat(Unit* /*who*/) OVERRIDE { - if (instance && !instance->GetData(DATA_KAELTHASEVENT) && !Phase) + if (!instance->GetData(DATA_KAELTHASEVENT) && !Phase) StartEvent(); } @@ -1046,7 +1046,7 @@ class boss_thaladred_the_darkener : public CreatureScript void JustDied(Unit* /*killer*/) OVERRIDE { - if (instance && instance->GetData(DATA_KAELTHASEVENT) == 3) + if (instance->GetData(DATA_KAELTHASEVENT) == 3) Talk(SAY_THALADRED_DEATH); } @@ -1138,7 +1138,7 @@ class boss_lord_sanguinar : public CreatureScript void JustDied(Unit* /*killer*/) OVERRIDE { - if (instance && instance->GetData(DATA_KAELTHASEVENT) == 3) + if (instance->GetData(DATA_KAELTHASEVENT) == 3) Talk(SAY_SANGUINAR_DEATH); } @@ -1203,7 +1203,7 @@ class boss_grand_astromancer_capernian : public CreatureScript void JustDied(Unit* /*killer*/) OVERRIDE { - if (instance && instance->GetData(DATA_KAELTHASEVENT) == 3) + if (instance->GetData(DATA_KAELTHASEVENT) == 3) Talk(SAY_CAPERNIAN_DEATH); } @@ -1342,7 +1342,7 @@ class boss_master_engineer_telonicus : public CreatureScript void JustDied(Unit* /*killer*/) OVERRIDE { - if (instance && instance->GetData(DATA_KAELTHASEVENT) == 3) + if (instance->GetData(DATA_KAELTHASEVENT) == 3) Talk(SAY_TELONICUS_DEATH); } diff --git a/src/server/scripts/Outland/TempestKeep/Eye/boss_void_reaver.cpp b/src/server/scripts/Outland/TempestKeep/Eye/boss_void_reaver.cpp index a1917d6201c..1a972f65360 100644 --- a/src/server/scripts/Outland/TempestKeep/Eye/boss_void_reaver.cpp +++ b/src/server/scripts/Outland/TempestKeep/Eye/boss_void_reaver.cpp @@ -77,7 +77,7 @@ class boss_void_reaver : public CreatureScript Enraged = false; - if (instance && me->IsAlive()) + if (me->IsAlive()) instance->SetData(DATA_VOIDREAVEREVENT, NOT_STARTED); } diff --git a/src/server/scripts/Outland/zone_blades_edge_mountains.cpp b/src/server/scripts/Outland/zone_blades_edge_mountains.cpp index 83b4f0440e0..3f1579c42b1 100644 --- a/src/server/scripts/Outland/zone_blades_edge_mountains.cpp +++ b/src/server/scripts/Outland/zone_blades_edge_mountains.cpp @@ -113,7 +113,10 @@ public: struct npc_bloodmaul_bruteAI : public ScriptedAI { - npc_bloodmaul_bruteAI(Creature* creature) : ScriptedAI(creature) { } + npc_bloodmaul_bruteAI(Creature* creature) : ScriptedAI(creature) + { + hp30 = false; + } void Reset() OVERRIDE { @@ -1125,9 +1128,10 @@ public: struct npc_oscillating_frequency_scanner_master_bunnyAI : public ScriptedAI { - npc_oscillating_frequency_scanner_master_bunnyAI(Creature* creature) : ScriptedAI(creature) + npc_oscillating_frequency_scanner_master_bunnyAI(Creature* creature) : ScriptedAI(creature) { playerGuid = 0; + timer = 500; } void Reset() OVERRIDE diff --git a/src/server/scripts/Pet/pet_dk.cpp b/src/server/scripts/Pet/pet_dk.cpp index daeb0d71720..61c3de0e6b1 100644 --- a/src/server/scripts/Pet/pet_dk.cpp +++ b/src/server/scripts/Pet/pet_dk.cpp @@ -54,7 +54,7 @@ class npc_pet_dk_ebon_gargoyle : public CreatureScript uint64 ownerGuid = me->GetOwnerGUID(); if (!ownerGuid) return; - + // Find victim of Summon Gargoyle spell std::list<Unit*> targets; Trinity::AnyUnfriendlyUnitInObjectRangeCheck u_check(me, me, 30.0f); diff --git a/src/server/scripts/Pet/pet_hunter.cpp b/src/server/scripts/Pet/pet_hunter.cpp index 0db35bf2fe6..8a0b78b5478 100644 --- a/src/server/scripts/Pet/pet_hunter.cpp +++ b/src/server/scripts/Pet/pet_hunter.cpp @@ -25,9 +25,9 @@ enum HunterSpells { - SPELL_HUNTER_CRIPPLING_POISON = 30981, // Viper - SPELL_HUNTER_DEADLY_POISON = 34655, // Venomous Snake - SPELL_HUNTER_MIND_NUMBING_POISON = 25810 // Viper + SPELL_HUNTER_CRIPPLING_POISON = 30981, // Viper + SPELL_HUNTER_DEADLY_POISON_PASSIVE = 34657, // Venomous Snake + SPELL_HUNTER_MIND_NUMBING_POISON = 25810 // Viper }; enum HunterCreatures @@ -57,14 +57,17 @@ class npc_pet_hunter_snake_trap : public CreatureScript me->SetMaxHealth(uint32(107 * (me->getLevel() - 40) * 0.025f)); // Add delta to make them not all hit the same time uint32 delta = (rand() % 7) * 100; - me->SetStatFloatValue(UNIT_FIELD_BASEATTACKTIME, float(Info->baseattacktime + delta)); - me->SetStatFloatValue(UNIT_FIELD_RANGED_ATTACK_POWER, float(Info->attackpower)); + me->SetAttackTime(BASE_ATTACK, Info->baseattacktime + delta); + //me->SetStatFloatValue(UNIT_FIELD_RANGED_ATTACK_POWER, float(Info->attackpower)); // Start attacking attacker of owner on first ai update after spawn - move in line of sight may choose better target if (!me->GetVictim() && me->IsSummon()) if (Unit* Owner = me->ToTempSummon()->GetSummoner()) if (Owner->getAttackerForHelper()) AttackStart(Owner->getAttackerForHelper()); + + if (!_isViper) + DoCast(me, SPELL_HUNTER_DEADLY_POISON_PASSIVE, true); } // Redefined for random target selection: @@ -99,32 +102,19 @@ class npc_pet_hunter_snake_trap : public CreatureScript return; } - if (_spellTimer <= diff) + // Viper + if (_isViper) { - if (_isViper) // Viper + if (_spellTimer <= diff) { - if (urand(0, 2) == 0) //33% chance to cast - { - uint32 spell; - if (urand(0, 1) == 0) - spell = SPELL_HUNTER_MIND_NUMBING_POISON; - else - spell = SPELL_HUNTER_CRIPPLING_POISON; - - DoCastVictim(spell); - } + if (urand(0, 2) == 0) // 33% chance to cast + DoCastVictim(RAND(SPELL_HUNTER_MIND_NUMBING_POISON, SPELL_HUNTER_CRIPPLING_POISON)); _spellTimer = 3000; } - else // Venomous Snake - { - if (urand(0, 2) == 0) // 33% chance to cast - DoCastVictim(SPELL_HUNTER_DEADLY_POISON); - _spellTimer = 1500 + (rand() % 5) * 100; - } + else + _spellTimer -= diff; } - else - _spellTimer -= diff; DoMeleeAttackIfReady(); } diff --git a/src/server/scripts/Spells/spell_dk.cpp b/src/server/scripts/Spells/spell_dk.cpp index 3f5bb34015e..e1ef9ea6862 100644 --- a/src/server/scripts/Spells/spell_dk.cpp +++ b/src/server/scripts/Spells/spell_dk.cpp @@ -879,7 +879,7 @@ class spell_dk_presence : public SpellScriptLoader { Unit* target = GetTarget(); - if (GetSpellInfo()->Id == SPELL_DK_BLOOD_PRESENCE) + if (GetId() == SPELL_DK_BLOOD_PRESENCE) target->CastSpell(target, SPELL_DK_IMPROVED_BLOOD_PRESENCE_TRIGGERED, true); else if (AuraEffect const* impAurEff = target->GetAuraEffectOfRankedSpell(SPELL_DK_IMPROVED_BLOOD_PRESENCE_R1, EFFECT_0)) if (!target->HasAura(SPELL_DK_IMPROVED_BLOOD_PRESENCE_TRIGGERED)) @@ -890,7 +890,7 @@ class spell_dk_presence : public SpellScriptLoader { Unit* target = GetTarget(); - if (GetSpellInfo()->Id == SPELL_DK_FROST_PRESENCE) + if (GetId() == SPELL_DK_FROST_PRESENCE) target->CastSpell(target, SPELL_DK_FROST_PRESENCE_TRIGGERED, true); else if (AuraEffect const* impAurEff = target->GetAuraEffectOfRankedSpell(SPELL_DK_IMPROVED_FROST_PRESENCE_R1, EFFECT_0)) if (!target->HasAura(SPELL_DK_FROST_PRESENCE_TRIGGERED)) @@ -901,12 +901,12 @@ class spell_dk_presence : public SpellScriptLoader { Unit* target = GetTarget(); - if (GetSpellInfo()->Id == SPELL_DK_UNHOLY_PRESENCE) + if (GetId() == SPELL_DK_UNHOLY_PRESENCE) target->CastSpell(target, SPELL_DK_UNHOLY_PRESENCE_TRIGGERED, true); if (AuraEffect const* impAurEff = target->GetAuraEffectOfRankedSpell(SPELL_DK_IMPROVED_UNHOLY_PRESENCE_R1, EFFECT_0)) { - if (GetSpellInfo()->Id == SPELL_DK_UNHOLY_PRESENCE) + if (GetId() == SPELL_DK_UNHOLY_PRESENCE) { // Not listed as any effect, only base points set int32 bp = impAurEff->GetSpellInfo()->Effects[EFFECT_1].CalcValue(); diff --git a/src/server/scripts/Spells/spell_quest.cpp b/src/server/scripts/Spells/spell_quest.cpp index 419a289aed4..cdf32bd94d5 100644 --- a/src/server/scripts/Spells/spell_quest.cpp +++ b/src/server/scripts/Spells/spell_quest.cpp @@ -1606,6 +1606,7 @@ class spell_q12527_zuldrak_rat : public SpellScriptLoader } }; +// 55368 - Summon Stefan class spell_q12661_q12669_q12676_q12677_q12713_summon_stefan : public SpellScriptLoader { public: @@ -1615,19 +1616,16 @@ class spell_q12661_q12669_q12676_q12677_q12713_summon_stefan : public SpellScrip { PrepareSpellScript(spell_q12661_q12669_q12676_q12677_q12713_summon_stefan_SpellScript); - void ChangeSummonPos(SpellEffIndex /*effIndex*/) + void SetDest(SpellDestination& dest) { // Adjust effect summon position - WorldLocation summonPos = *GetExplTargetDest(); - Position offset = { 0.0f, 0.0f, 20.0f, 0.0f }; - summonPos.RelocateOffset(offset); - SetExplTargetDest(summonPos); - GetHitDest()->RelocateOffset(offset); + Position const offset = { 0.0f, 0.0f, 20.0f, 0.0f }; + dest.RelocateOffset(offset); } void Register() OVERRIDE { - OnEffectHit += SpellEffectFn(spell_q12661_q12669_q12676_q12677_q12713_summon_stefan_SpellScript::ChangeSummonPos, EFFECT_0, SPELL_EFFECT_SUMMON); + OnDestinationTargetSelect += SpellDestinationTargetSelectFn(spell_q12661_q12669_q12676_q12677_q12713_summon_stefan_SpellScript::SetDest, EFFECT_0, TARGET_DEST_CASTER_BACK); } }; @@ -1723,6 +1721,7 @@ class spell_q13291_q13292_q13239_q13261_frostbrood_skytalon_grab_decoy : public } }; +// 59303 - Summon Frost Wyrm class spell_q13291_q13292_q13239_q13261_armored_decoy_summon_skytalon : public SpellScriptLoader { public: @@ -1732,19 +1731,16 @@ class spell_q13291_q13292_q13239_q13261_armored_decoy_summon_skytalon : public S { PrepareSpellScript(spell_q13291_q13292_q13239_q13261_armored_decoy_summon_skytalon_SpellScript); - void ChangeSummonPos(SpellEffIndex /*effIndex*/) + void SetDest(SpellDestination& dest) { // Adjust effect summon position - WorldLocation summonPos = *GetExplTargetDest(); - Position offset = { 0.0f, 0.0f, 20.0f, 0.0f }; - summonPos.RelocateOffset(offset); - SetExplTargetDest(summonPos); - GetHitDest()->RelocateOffset(offset); + Position const offset = { 0.0f, 0.0f, 20.0f, 0.0f }; + dest.RelocateOffset(offset); } void Register() OVERRIDE { - OnEffectHit += SpellEffectFn(spell_q13291_q13292_q13239_q13261_armored_decoy_summon_skytalon_SpellScript::ChangeSummonPos, EFFECT_0, SPELL_EFFECT_SUMMON); + OnDestinationTargetSelect += SpellDestinationTargetSelectFn(spell_q13291_q13292_q13239_q13261_armored_decoy_summon_skytalon_SpellScript::SetDest, EFFECT_0, TARGET_DEST_CASTER_BACK); } }; @@ -1754,6 +1750,7 @@ class spell_q13291_q13292_q13239_q13261_armored_decoy_summon_skytalon : public S } }; +// 12601 - Second Chances: Summon Landgren's Soul Moveto Target Bunny class spell_q12847_summon_soul_moveto_bunny : public SpellScriptLoader { public: @@ -1763,19 +1760,16 @@ class spell_q12847_summon_soul_moveto_bunny : public SpellScriptLoader { PrepareSpellScript(spell_q12847_summon_soul_moveto_bunny_SpellScript); - void ChangeSummonPos(SpellEffIndex /*effIndex*/) + void SetDest(SpellDestination& dest) { // Adjust effect summon position - WorldLocation summonPos = *GetExplTargetDest(); - Position offset = { 0.0f, 0.0f, 2.5f, 0.0f }; - summonPos.RelocateOffset(offset); - SetExplTargetDest(summonPos); - GetHitDest()->RelocateOffset(offset); + Position const offset = { 0.0f, 0.0f, 2.5f, 0.0f }; + dest.RelocateOffset(offset); } void Register() OVERRIDE { - OnEffectHit += SpellEffectFn(spell_q12847_summon_soul_moveto_bunny_SpellScript::ChangeSummonPos, EFFECT_0, SPELL_EFFECT_SUMMON); + OnDestinationTargetSelect += SpellDestinationTargetSelectFn(spell_q12847_summon_soul_moveto_bunny_SpellScript::SetDest, EFFECT_0, TARGET_DEST_CASTER); } }; @@ -2012,19 +2006,19 @@ class spell_q12308_escape_from_silverbrook_summon_worgen : public SpellScriptLoa { PrepareSpellScript(spell_q12308_escape_from_silverbrook_summon_worgen_SpellScript); - void ModDest(SpellEffIndex effIndex) + void ModDest(SpellDestination& dest) { - float dist = GetSpellInfo()->Effects[effIndex].CalcRadius(GetCaster()); - float angle = (urand(0, 1) ? -1 : 1) * (frand(0.75f, 1.0f) * M_PI); + float dist = GetSpellInfo()->Effects[EFFECT_0].CalcRadius(GetCaster()); + float angle = frand(0.75f, 1.25f) * M_PI; Position pos; GetCaster()->GetNearPosition(pos, dist, angle); - GetHitDest()->Relocate(&pos); + dest.Relocate(pos); } void Register() OVERRIDE { - OnEffectHit += SpellEffectFn(spell_q12308_escape_from_silverbrook_summon_worgen_SpellScript::ModDest, EFFECT_0, SPELL_EFFECT_SUMMON); + OnDestinationTargetSelect += SpellDestinationTargetSelectFn(spell_q12308_escape_from_silverbrook_summon_worgen_SpellScript::ModDest, EFFECT_0, TARGET_DEST_CASTER_SUMMON); } }; @@ -2241,6 +2235,47 @@ class spell_q12919_gymers_throw : public SpellScriptLoader } }; +enum Quest_The_Hunter_And_The_Prince +{ + SPELL_ILLIDAN_KILL_CREDIT = 61748 +}; + +class spell_q13400_illidan_kill_master : public SpellScriptLoader +{ + public: + spell_q13400_illidan_kill_master() : SpellScriptLoader("spell_q13400_illidan_kill_master") { } + + class spell_q13400_illidan_kill_master_SpellScript : public SpellScript + { + PrepareSpellScript(spell_q13400_illidan_kill_master_SpellScript); + + bool Validate(SpellInfo const* /*spellInfo*/) OVERRIDE + { + if (!sSpellMgr->GetSpellInfo(SPELL_ILLIDAN_KILL_CREDIT)) + return false; + return true; + } + + void HandleDummy(SpellEffIndex /*effIndex*/) + { + Unit* caster = GetCaster(); + if (caster->IsVehicle()) + if (Unit* passenger = caster->GetVehicleKit()->GetPassenger(0)) + passenger->CastSpell(passenger, SPELL_ILLIDAN_KILL_CREDIT, true); + } + + void Register() OVERRIDE + { + OnEffectHitTarget += SpellEffectFn(spell_q13400_illidan_kill_master_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); + } + }; + + SpellScript* GetSpellScript() const OVERRIDE + { + return new spell_q13400_illidan_kill_master_SpellScript(); + } +}; + void AddSC_quest_spell_scripts() { new spell_q55_sacred_cleansing(); @@ -2295,4 +2330,5 @@ void AddSC_quest_spell_scripts() new spell_q12619_emblazon_runeblade_effect(); new spell_q12919_gymers_grab(); new spell_q12919_gymers_throw(); + new spell_q13400_illidan_kill_master(); } diff --git a/src/server/scripts/Spells/spell_rogue.cpp b/src/server/scripts/Spells/spell_rogue.cpp index 4670117f0ea..b8b652eb314 100644 --- a/src/server/scripts/Spells/spell_rogue.cpp +++ b/src/server/scripts/Spells/spell_rogue.cpp @@ -25,16 +25,21 @@ #include "ScriptMgr.h" #include "SpellScript.h" #include "SpellAuraEffects.h" +#include "Containers.h" enum RogueSpells { - SPELL_ROGUE_BLADE_FLURRY_EXTRA_ATTACK = 22482, - SPELL_ROGUE_CHEAT_DEATH_COOLDOWN = 31231, - SPELL_ROGUE_GLYPH_OF_PREPARATION = 56819, - SPELL_ROGUE_PREY_ON_THE_WEAK = 58670, - SPELL_ROGUE_SHIV_TRIGGERED = 5940, - SPELL_ROGUE_TRICKS_OF_THE_TRADE_DMG_BOOST = 57933, - SPELL_ROGUE_TRICKS_OF_THE_TRADE_PROC = 59628, + SPELL_ROGUE_BLADE_FLURRY_EXTRA_ATTACK = 22482, + SPELL_ROGUE_CHEAT_DEATH_COOLDOWN = 31231, + SPELL_ROGUE_GLYPH_OF_PREPARATION = 56819, + SPELL_ROGUE_KILLING_SPREE = 51690, + SPELL_ROGUE_KILLING_SPREE_TELEPORT = 57840, + SPELL_ROGUE_KILLING_SPREE_WEAPON_DMG = 57841, + SPELL_ROGUE_KILLING_SPREE_DMG_BUFF = 61851, + SPELL_ROGUE_PREY_ON_THE_WEAK = 58670, + SPELL_ROGUE_SHIV_TRIGGERED = 5940, + SPELL_ROGUE_TRICKS_OF_THE_TRADE_DMG_BOOST = 57933, + SPELL_ROGUE_TRICKS_OF_THE_TRADE_PROC = 59628, }; // 13877, 33735, (check 51211, 65956) - Blade Flurry @@ -249,6 +254,105 @@ class spell_rog_deadly_poison : public SpellScriptLoader } }; +// 51690 - Killing Spree +class spell_rog_killing_spree : public SpellScriptLoader +{ + public: + spell_rog_killing_spree() : SpellScriptLoader("spell_rog_killing_spree") { } + + class spell_rog_killing_spree_SpellScript : public SpellScript + { + PrepareSpellScript(spell_rog_killing_spree_SpellScript); + + void FilterTargets(std::list<WorldObject*>& targets) + { + if (targets.empty() || GetCaster()->GetVehicleBase()) + FinishCast(SPELL_FAILED_OUT_OF_RANGE); + } + + void HandleDummy(SpellEffIndex /*effIndex*/) + { + if (Aura* aura = GetCaster()->GetAura(SPELL_ROGUE_KILLING_SPREE)) + { + if (spell_rog_killing_spree_AuraScript* script = dynamic_cast<spell_rog_killing_spree_AuraScript*>(aura->GetScriptByName("spell_rog_killing_spree"))) + script->AddTarget(GetHitUnit()); + } + } + + void Register() OVERRIDE + { + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_rog_killing_spree_SpellScript::FilterTargets, EFFECT_1, TARGET_UNIT_DEST_AREA_ENEMY); + OnEffectHitTarget += SpellEffectFn(spell_rog_killing_spree_SpellScript::HandleDummy, EFFECT_1, SPELL_EFFECT_DUMMY); + } + }; + + SpellScript* GetSpellScript() const OVERRIDE + { + return new spell_rog_killing_spree_SpellScript(); + } + + class spell_rog_killing_spree_AuraScript : public AuraScript + { + PrepareAuraScript(spell_rog_killing_spree_AuraScript); + + bool Validate(SpellInfo const* /*spellInfo*/) OVERRIDE + { + if (!sSpellMgr->GetSpellInfo(SPELL_ROGUE_KILLING_SPREE_TELEPORT) + || !sSpellMgr->GetSpellInfo(SPELL_ROGUE_KILLING_SPREE_WEAPON_DMG) + || !sSpellMgr->GetSpellInfo(SPELL_ROGUE_KILLING_SPREE_DMG_BUFF)) + return false; + return true; + } + + void HandleApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + { + GetTarget()->CastSpell(GetTarget(), SPELL_ROGUE_KILLING_SPREE_DMG_BUFF, true); + } + + void HandleEffectPeriodic(AuraEffect const* /*aurEff*/) + { + while (!_targets.empty()) + { + uint64 guid = Trinity::Containers::SelectRandomContainerElement(_targets); + if (Unit* target = ObjectAccessor::GetUnit(*GetTarget(), guid)) + { + GetTarget()->CastSpell(target, SPELL_ROGUE_KILLING_SPREE_TELEPORT, true); + GetTarget()->CastSpell(target, SPELL_ROGUE_KILLING_SPREE_WEAPON_DMG, true); + break; + } + else + _targets.remove(guid); + } + } + + void HandleRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + { + GetTarget()->RemoveAurasDueToSpell(SPELL_ROGUE_KILLING_SPREE_DMG_BUFF); + } + + void Register() OVERRIDE + { + AfterEffectApply += AuraEffectApplyFn(spell_rog_killing_spree_AuraScript::HandleApply, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY, AURA_EFFECT_HANDLE_REAL); + OnEffectPeriodic += AuraEffectPeriodicFn(spell_rog_killing_spree_AuraScript::HandleEffectPeriodic, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY); + AfterEffectRemove += AuraEffectRemoveFn(spell_rog_killing_spree_AuraScript::HandleRemove, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY, AURA_EFFECT_HANDLE_REAL); + } + + public: + void AddTarget(Unit* target) + { + _targets.push_back(target->GetGUID()); + } + + private: + std::list<uint64> _targets; + }; + + AuraScript* GetAuraScript() const OVERRIDE + { + return new spell_rog_killing_spree_AuraScript(); + } +}; + // -31130 - Nerves of Steel class spell_rog_nerves_of_steel : public SpellScriptLoader { @@ -594,6 +698,7 @@ void AddSC_rogue_spell_scripts() new spell_rog_blade_flurry(); new spell_rog_cheat_death(); new spell_rog_deadly_poison(); + new spell_rog_killing_spree(); new spell_rog_nerves_of_steel(); new spell_rog_preparation(); new spell_rog_prey_on_the_weak(); diff --git a/src/server/scripts/World/npcs_special.cpp b/src/server/scripts/World/npcs_special.cpp index e9a010868d8..ac30f6f1e80 100644 --- a/src/server/scripts/World/npcs_special.cpp +++ b/src/server/scripts/World/npcs_special.cpp @@ -34,7 +34,6 @@ npc_garments_of_quests 80% NPC's related to all Garments of-quests 5621, 56 npc_injured_patient 100% patients for triage-quests (6622 and 6624) npc_doctor 100% Gustaf Vanhowzen and Gregory Victor, quest 6622 and 6624 (Triage) npc_mount_vendor 100% Regular mount vendors all over the world. Display gossip if player doesn't meet the requirements to buy -npc_rogue_trainer 80% Scripted trainers, so they are able to offer item 17126 for class quest 6681 npc_sayge 100% Darkmoon event fortune teller, buff player based on answers given npc_snake_trap_serpents 80% AI for snakes that summoned by Snake Trap npc_shadowfiend 100% restore 5% of owner's mana when shadowfiend die from damage @@ -1239,86 +1238,6 @@ public: } }; -/*###### -## npc_rogue_trainer -######*/ - -#define GOSSIP_HELLO_ROGUE1 "I wish to unlearn my talents" -#define GOSSIP_HELLO_ROGUE2 "<Take the letter>" -#define GOSSIP_HELLO_ROGUE3 "Purchase a Dual Talent Specialization." - -class npc_rogue_trainer : public CreatureScript -{ -public: - npc_rogue_trainer() : CreatureScript("npc_rogue_trainer") { } - - bool OnGossipHello(Player* player, Creature* creature) OVERRIDE - { - if (creature->IsQuestGiver()) - player->PrepareQuestMenu(creature->GetGUID()); - - if (creature->IsTrainer()) - player->ADD_GOSSIP_ITEM(GOSSIP_ICON_TRAINER, GOSSIP_TEXT_TRAIN, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_TRAIN); - - if (player->getClass() == CLASS_ROGUE) - player->ADD_GOSSIP_ITEM(GOSSIP_ICON_TRAINER, GOSSIP_HELLO_ROGUE1, GOSSIP_SENDER_MAIN, GOSSIP_OPTION_UNLEARNTALENTS); - - if (player->GetSpecsCount() == 1 && player->getLevel() >= sWorld->getIntConfig(CONFIG_MIN_DUALSPEC_LEVEL)) - player->ADD_GOSSIP_ITEM(GOSSIP_ICON_TRAINER, GOSSIP_HELLO_ROGUE3, GOSSIP_SENDER_MAIN, GOSSIP_OPTION_LEARNDUALSPEC); - - if (player->getClass() == CLASS_ROGUE && player->getLevel() >= 24 && !player->HasItemCount(17126) && !player->GetQuestRewardStatus(6681)) - { - player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_HELLO_ROGUE2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); - player->SEND_GOSSIP_MENU(5996, creature->GetGUID()); - } else - player->SEND_GOSSIP_MENU(player->GetGossipTextId(creature), creature->GetGUID()); - - return true; - } - - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) OVERRIDE - { - player->PlayerTalkClass->ClearMenus(); - switch (action) - { - case GOSSIP_ACTION_INFO_DEF + 1: - player->CLOSE_GOSSIP_MENU(); - player->CastSpell(player, 21100, false); - break; - case GOSSIP_ACTION_TRAIN: - player->GetSession()->SendTrainerList(creature->GetGUID()); - break; - case GOSSIP_OPTION_UNLEARNTALENTS: - player->CLOSE_GOSSIP_MENU(); - player->SendTalentWipeConfirm(creature->GetGUID()); - break; - case GOSSIP_OPTION_LEARNDUALSPEC: - if (player->GetSpecsCount() == 1 && !(player->getLevel() < sWorld->getIntConfig(CONFIG_MIN_DUALSPEC_LEVEL))) - { - if (!player->HasEnoughMoney(10000000)) - { - player->SendBuyError(BUY_ERR_NOT_ENOUGHT_MONEY, 0, 0, 0); - player->PlayerTalkClass->SendCloseGossip(); - break; - } - else - { - player->ModifyMoney(-10000000); - - // Cast spells that teach dual spec - // Both are also ImplicitTarget self and must be cast by player - player->CastSpell(player, 63680, true, NULL, NULL, player->GetGUID()); - player->CastSpell(player, 63624, true, NULL, NULL, player->GetGUID()); - - // Should show another Gossip text with "Congratulations..." - player->PlayerTalkClass->SendCloseGossip(); - } - } - break; - } - return true; - } -}; /*###### ## npc_sayge @@ -2445,7 +2364,6 @@ void AddSC_npcs_special() new npc_garments_of_quests(); new npc_guardian(); new npc_mount_vendor(); - new npc_rogue_trainer(); new npc_sayge(); new npc_steam_tonk(); new npc_tonk_mine(); |